【问题标题】:python urllib2.urlopen(url) process blockpython urllib2.urlopen(url) 进程块
【发布时间】:2012-07-26 07:09:18
【问题描述】:

我正在使用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

【问题讨论】:

  • 您需要发布实际阻塞的代码。 urlopen 阻塞,直到它收到响应或引发超时错误。如果没有看到您的代码,没有人可以知道为什么它没有引发超时错误。
  • 您看到了哪些错误消息?你能发布引发错误的代码吗?
  • 您的客户端连接到什么?它是 HTTP 网络服务器吗?它是否会产生响应(urlopen 会挂起直到它得到某些东西)?如果您连接另一个 http 客户端会发生什么,例如卷曲?

标签: python urlopen


【解决方案1】:

如果你的问题是需要 urllib 才能读完

read() 操作在 Python 中是阻塞操作。

如果你想创建异步请求

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

同样,使用上面提到的requests 库。

【讨论】:

    【解决方案2】:

    您可以尝试使用 strace(或类似的)工具来找出阻止您的 python 脚本的实际 system 调用,例如在 linux 上:$ strace python yourscript.py

    你的脚本.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
    

    【讨论】:

    • (gdb) bt #0 0x0000003c6200dc35 in recv () from /lib64/libpthread.so.0 #1 0x00002b88add08137 in ?? () 来自 /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
    猜你喜欢
    • 2023-03-18
    • 2012-08-18
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2017-11-22
    • 2012-04-11
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多