3

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

4

1 回答 1

0

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

于 2012-09-25T02:11:23.230 回答