gpt4 book ai didi

Python多线程——主线程 block socket.connect

转载 作者:行者123 更新时间:2023-11-28 19:26:08 25 4
gpt4 key购买 nike

我有以下问题。我的线程很少。有只等待终止调用的主线程和上传文件的子线程。不幸的是,子线程在想要连接特定服务器时被阻塞。我在 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)

我做错了什么?


当我运行同一个程序的几个副本时(每个副本都是一个上传线程)一切正常。这意味着服务器允许来自一个客户端的多个连接。

没有主线程时一切正常IE。当我以这种方式更改主线程时(删除等待循环):

    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() 包含与服务器连接的代码片段。

最佳答案

您可能想考虑使用多处理库而不是线程。它有一些限制,但它回避了 GIL 问题。

关于Python多线程——主线程 block socket.connect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11816089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com