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()的
定義包含代碼段與連接到服務器。
如果子線程逐個執行,也許套接字服務器不是多線程 – xiaowl 2012-08-05 11:43:15
事情是,當我只起訴一個線程上傳一切都OK。如果多於每個子線程都被阻塞在那個地方。 當我啓動子線程後刪除主線程,然後一切正常。但我想保持主線程。 – Anonim33 2012-08-05 11:50:06
這是GIL做它的事情嗎?你知道線程是如何在Python中工作的,是的?一次只能運行一個線程,並且GIL在特定時間將控制權交給不同的線程。 – 2012-08-05 12:01:50