2013-03-14 92 views
4

我写一个Python套接字客户端,Python的插座异步收发设计

  1. 发出message one(如你好)每5秒和message two(例如15秒),每15秒
  2. 在收到消息任何时间

我的意思是做不同的线程发送和接收。但它仍然阻塞。 有没有人有建议?

线程#1

threading.Thread(target=Thread2, args=(sock)).start() 
sock.recv(1024) 

线程#2

def Thread2(sock): 
    count = 0 
    while True: 
     sleep(5) 
     count = count + 5 
     sock.send('Hello') 
     if count % 15 == 0 
      sock.send('15 seconds') 
+0

如果你想要一个答案,请张贴你写的代码的相关部分。或者你会冒险让问题关闭 – 2013-03-14 08:57:52

+0

感谢您的意见 – Winston 2013-03-14 09:14:43

+0

@Winston代码不足。你如何创建这些线程? – freakish 2013-03-14 09:20:38

回答

3

它不阻塞。只是你的主线程在第一个sock.recv(1024)之后什么都不做。你必须告诉它不断地收集数据:

主线程

threading.Thread(target=Thread2, args=(sock,)).start() 
while True: 
    data = sock.recv(1024) 
    if not data: 
     break 
    print data 

请注意,您将无法轻易打断这一进程。为了做到这一点,你需要设置线程作为守护程序:

主线程

t = threading.Thread(target=Thread2, args=(sock,)) 
t.daemon = True 
t.start() 
while True: 
    data = sock.recv(1024) 
    if not data: 
     break 
    print data 

此外,当你路过args记得要传递一个元组的,亦即args=(sock,)代替args=(sock)。对于Python args=(sock)相当于args=sock。这可能是罪魁祸首!

我在代码中看不到更多问题。

+0

感谢您的回答。我只知道python提供了一个名为asyncore/asynchat的模块。我可以使用它来实现非阻塞I/O吗? – Winston 2013-03-15 04:12:24

+0

@Winston对不起,这个迟到的回应(不知何故,我错过了这个问题)。是的,你可以用它来实现非阻塞I/O(我在工作中一直使用asyncore)。 – freakish 2013-04-30 15:44:24