2012-08-05 138 views
3

我有以下問題。我有幾個線程。有主線程只等待終止呼叫和線程 - 上傳文件的子節點。不幸的是,當他們想要與特定服務器連接時,子線程被阻塞。 我在Linux上使用python2.7。Python多線程 - 主線程塊socket.connect

主線程包含此代碼:

for i in xrange(n): 
     upl = UploaderThread(self.user, self.password) 
     upl.start() 
    while threading.active_count() > 1: 
     time.sleep(1000.) 

這是那裏的孩子,朝不保夕

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.settimeout(glob_timeout) 
    #this fragment of code is accessed 
    sock.connect(("95.211.193.147", 8084)) <- here the child-thread is blocked 
    #this fragment of code is not accessed anymore 
    sock.send(header) 

我該怎麼辦錯了的片段?


當我運行幾個副本的同一個程序(每個副本是一個上傳線程),一切都很好。這意味着服務器允許來自一個客戶端的多個連接。

一切正常,當我改變主線程以這種方式(去除等待循環)時,沒有主線程 即 :

for i in xrange(n): 
     upl = UploaderThread(self.user, self.password) 
     upl.start() 

然後主線程死亡後,每個子線程作品(是不再被阻擋)。

當我嘗試與其他服務器(不是「95.211.193.147」,8084)連接時,子線程不會被主線程阻塞。

我真的不明白是怎麼回事。 UploaderThread

class UploaderThread(threading.Thread): 
    def __init__(self, user, password): 
     threading.Thread.__init__(self) 
     self.uploader = Uploader(user, password) 
     self.daemon  = False 

    def run(self): 
     self.uploader.upload_dir() 

和self.uploader.upload_dir()的


定義包含代碼段與連接到服務器。

+0

如果子線程逐個執行,也許套接字服務器不是多線程 – xiaowl 2012-08-05 11:43:15

+0

事情是,當我只起訴一個線程上傳一切都OK。如果多於每個子線程都被阻塞在那個地方。 當我啓動子線程後刪除主線程,然後一切正常。但我想保持主線程。 – Anonim33 2012-08-05 11:50:06

+1

這是GIL做它的事情嗎?你知道線程是如何在Python中工作的,是的?一次只能運行一個線程,並且GIL在特定時間將控制權交給不同的線程。 – 2012-08-05 12:01:50

回答

0

您可能想考慮使用多處理庫而不是線程。它有一些限制,但它迴避了GIL問題。