gpt4 book ai didi

Python 解释器阻止多线程 DNS 请求?

转载 作者:太空狗 更新时间:2023-10-29 20:40:12 26 4
gpt4 key购买 nike

我只是稍微玩了一下 python 和线程,发现即使在多线程脚本中,DNS 请求也会阻塞。考虑以下脚本:

从线程导入线程导入套接字

class Connection(Thread):
def __init__(self, name, url):
Thread.__init__(self)
self._url = url
self._name = name

def run(self):
print "Connecting...", self._name
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setblocking(0)
s.connect((self._url, 80))
except socket.gaierror:
pass #not interested in it
print "finished", self._name


if __name__ == '__main__':
conns = []
# all invalid addresses to see how they fail / check times
conns.append(Connection("conn1", "www.2eg11erdhrtj.com"))
conns.append(Connection("conn2", "www.e2ger2dh2rtj.com"))
conns.append(Connection("conn3", "www.eg2de3rh1rtj.com"))
conns.append(Connection("conn4", "www.ege2rh4rd1tj.com"))
conns.append(Connection("conn5", "www.ege52drhrtj1.com"))

for conn in conns:
conn.start()

我不知道超时到底有多长,但是在运行时会发生以下情况:

  1. 所有线程开始,我得到我的打印输出
  2. 每隔 xx 秒,一个线程显示完成,而不是一次显示所有线程
  3. 线程按顺序完成,而不是一次全部完成(超时 = 所有线程都相同!)

所以我唯一的猜测是这与 GIL 有关吗?显然,线程不会同时执行它们的任务,一次只会尝试一个连接。

有人知道解决这个问题的方法吗?

(asyncore 没有帮助,我现在不想使用 twisted)难道用 python 做不到这个简单的小事吗?

你好,汤姆

编辑:

我在 MacOSX 上,我只是让我的 friend 在 linux 上运行它,他确实得到了我希望得到的结果。即使在非线程环境中,他的 socket.connects() 也会立即返回。甚至当他将套接字设置为阻塞并将超时设置为 10 秒时,他的所有线程也会同时完成。

谁能解释一下?

最佳答案

在某些系统上,getaddrinfo 不是线程安全的。 Python 认为,一些这样的系统是 FreeBSD、OpenBSD、NetBSD、OSX 和 VMS。在这些系统上,Python 专门为 netdb 维护一个锁(即 getaddrinfo 和 friend )。

因此,如果您不能切换操作系统,则必须使用不同的(线程安全的)解析器库,例如 twisted 的。

关于Python 解释器阻止多线程 DNS 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212716/

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