蟒urllib2.urlopen(URL)处理块(python urllib2.urlopen(ur

2019-07-30 14:43发布

我使用urllib2.urlopen()和我的过程中被阻塞

我知道urllib2.urlopen()有默认的超时时间。

如何使呼叫被阻挡?

回溯是

(gdb) bt 
#0 0x0000003c6200dc35 in recv () from /lib64/libpthread.so.0 
#1 0x00002b88add08137 in ?? () from /usr/lib64/python2.6/lib-dynload/_socketmodule.so 
#2 0x00002b88add0830e in ?? () from /usr/lib64/python2.6/lib-dynload/_socketmodule.so 
#3 0x000000310b2d8e19 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0

Answer 1:

如果你的问题是,你需要的urllib完成阅读

读()操作是在Python阻塞操作。

如果你想创建异步请求

  • 在非主线程做阅读http://docs.python.org/library/threading.html

  • 使用requests库和异步请求http://docs.python-requests.org/en/latest/user/advanced/#asynchronous-requests

如果您的问题需要设置超时

同样,使用requests如上所述库。



Answer 2:

您可以尝试使用strace (或类似)的工具来找出真正的系统调用是阻止你的Python脚本,例如在Linux上: $ strace python yourscript.py

yourscript.py:

from urllib2 import urlopen
urlopen("http://somesite.local/foobar.html")

$ strace python yourscript.py

... lots of system call stripped ...
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("127.0.0.1")}, 16


文章来源: python urllib2.urlopen(url) process block