python - pycurl/curl 不遵循 CURLOPT_TIMEOUT 选项

标签 python multithreading timeout pycurl

我有一个多线程脚本,当它连接到服务器时偶尔会卡住,但服务器不会发回任何东西。 Netstat 显示一个已连接的 tcp 套接字。即使我设置了超时也会发生这种情况。超时在无线程脚本中工作正常。这是一些示例代码。

def xmlscraper(url):
  htmlpage = StringIO.StringIO()
  rheader = StringIO.StringIO()
  c = pycurl.Curl()
  c.setopt(pycurl.USERAGENT, "user agent string")
  c.setopt(pycurl.CONNECTTIMEOUT, 60)
  c.setopt(pycurl.TIMEOUT, 120)
  c.setopt(pycurl.FOLLOWLOCATION, 1)
  c.setopt(pycurl.WRITEFUNCTION, htmlpage.write)
  c.setopt(pycurl.HEADERFUNCTION, rheader.write)
  c.setopt(pycurl.HTTPHEADER, ['Expect:'])
  c.setopt(pycurl.NOSIGNAL, 1)
  c.setopt(pycurl.URL, url)
  c.setopt(pycurl.HTTPGET, 1)

pycurl.global_init(pycurl.GLOBAL_ALL)
for url in urllist:
    t = threading.Thread(target=xmlscraper, args=(url,))
    t.start()

任何帮助将不胜感激!几周来一直在努力解决这个问题。

编辑: urllist 有大约 10 个 url。有多少似乎并不重要。

编辑2: 我刚刚在下面测试了这段代码。我使用了一个休眠 100 秒的 php 脚本。

import threading
import pycurl
def testf():
    c = pycurl.Curl()
    c.setopt(pycurl.CONNECTTIMEOUT, 3)
    c.setopt(pycurl.TIMEOUT, 6)
    c.setopt(pycurl.NOSIGNAL, 1)
    c.setopt(pycurl.URL, 'http://xxx.xxx.xxx.xxx/test.php')
    c.setopt(pycurl.HTTPGET, 1)
    c.perform()
t = threading.Thread(target=testf)
t.start()
t.join()

该代码中的 Pycurl 似乎正常超时。所以我想这与网址的数量有关?吉尔?

编辑3:

我认为这可能与 libcurl 本身有关,因为有时当我检查脚本时,libcurl 仍连续连接到服务器数小时。如果 pycurl 正确超时,则套接字将关闭。

最佳答案

我修改了您的“edit2”代码以生成多个线程,它在我的机器上运行良好(Ubuntu 10.10 和 Python 2.6.6)

import threading
import pycurl

def testf():
    c = pycurl.Curl()
    c.setopt(pycurl.CONNECTTIMEOUT, 3)
    c.setopt(pycurl.TIMEOUT, 3)
    c.setopt(pycurl.NOSIGNAL, 1)
    c.setopt(pycurl.URL, 'http://localhost/cgi-bin/foo.py')
    c.setopt(pycurl.HTTPGET, 1)
    c.perform()

for i in range(100):
    t = threading.Thread(target=testf)
    t.start()

我可以生成 100 个线程并在 3 秒内超时(如我指定的那样)。

我不会去指责 GIL 和线程争用 :)

关于python - pycurl/curl 不遵循 CURLOPT_TIMEOUT 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4549490/

相关文章:

mysql - Django,升级后 : MySQL server has gone away

mongodb - 如何在 MongoDB 中杀死死游标

python - 如何在 Python 中的非打印 ascii 字符处拆分行

java - Singleton Runnable 中奇怪的双重日志记录

java - 如何从 SupplySync 返回对象而不阻塞主线程?

c# - 如何将此 foreach 代码转换为 Parallel.ForEach?

python - "in"列表与字符串中的语句行为

python - 变量交换是否保证在python中是原子的?

java - Project Euler p21 有趣的程序行为

java - Spark streaming mapWithState 超时延迟?