我有以下问题。我的线程很少。主要线程只等待终止调用和上传文件的线程子节点。不幸的是,当他们想要连接特定服务器时,子线程被阻止。 我在Linux上使用python2.7。
主线程包含以下代码:
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 :(得分:0)
您可能需要考虑使用多处理库而不是线程。它有一些局限性,但它避开了GIL问题。