2013-03-14 58 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