gpt4 book ai didi

python - urlopen/requests.get 在导入模块中创建的线程中不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:12 25 4
gpt4 key购买 nike

我有 urlopen 的问题(和请求。获取)

在我的程序中,如果我在一个线程中运行它(我也用 multiprocessing 测试过)[更新:一个由导入模块创建的线程]它不会运行直到程序结束。

“不会运行”我的意思是甚至不会启动:超时(此处为 3 秒)永远不会触发,并且没有与网站建立连接。

这是我的简化代码:

import threading,urllib2,time

def dlfile(url):
print 'Before request'
r = urllib2.urlopen(url, timeout=3)
print 'After request'
return r

def dlfiles(*urls):
threads = [threading.Thread(None, dlfile, None, (url,), {}) for url in urls]
map(lambda t:t.start(), threads)

def main():
dlfiles('http://google.com')

main()
time.sleep(10)
print 'End of program'

我的输出:

Before request
End of program
After request

不幸的是,我在 SO 上编写的代码按预期工作(即“请求前/请求后/程序结束”),我还不能用简化的代码重现问题。

<罢工>

我仍在尝试,但与此同时,我想知道是否有人遇到过这种奇怪的行为以及可能导致这种行为的原因。请注意,如果我不使用线程,一切都很好。

感谢您提供的任何帮助,我有点迷茫,连互联网都不知道这一点

更新

这是重现行为的方法

线程测试.py

import threading,urllib2,time
def log(a):print(a)
def dlfile(url):
log('Before request')
r = urllib2.urlopen(url, timeout=3)
log('After request')
return r

def dlfiles(*urls):
threads = [threading.Thread(None, dlfile, None, (url,), {}) for url in urls]
map(lambda t:t.start(), threads)

def main():
dlfiles('http://google.com')

main()
for i in range(5):
time.sleep(1)
log('Sleep')
log('End of program')

threadtest-import.py

导入线程测试

那么输出将是这样的:

$ python threadtest.py
Before request
After request
Sleep
Sleep
Sleep
Sleep
Sleep
End of program

$ python threadtest-import.py
Before request
Sleep
Sleep
Sleep
Sleep
Sleep
End of program
After request

现在我找到了重现的方法:这种行为正常吗?预期?

我怎样才能摆脱它? IE。从导入的模块创建一个线程,该线程可以按预期方式加载 urlopen。

最佳答案

您的代码没问题。预计单次发射。

def main():
dlfiles('http://google.fr')

此处您传递的是单个 url

threads = [threading.Thread(None, dlfile, None, (url,), {}) for url in urls]

列表理解将只产生一个线程,因为 urls 中只有一个元素。

尝试:

def main():
dlfiles('http://google.fr', 'http://google.com', 'http://google.gg')

关于python - urlopen/requests.get 在导入模块中创建的线程中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36406318/

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