您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – pycurl / curl不遵循CURLOPT_TIMEOUT选项

5b51 2022/1/14 8:21:23 python 字数 3411 阅读 497 来源 www.jb51.cc/python

我有一个多线程脚本,当它连接到服务器但服务器不发回任何东西时偶尔会冻结. Netstat显示连接的tcp套接字.即使我设置了TIMEOUT,也会发生这种情况.超时脚本中的超时工作正常.这是一些示例代码.def xmlscraper(url): htmlpage = StringIO.StringIO() rheader = StringIO.Stri

概述

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

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个网址.似乎有多少并不重要.

EDIT2:
我刚刚在下面测试了这段代码.我使用了一个睡眠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似乎正常超时.所以我猜它与网址的数量有关? GIL?

EDIT3:

我认为它可能与libcurl本身有关,因为当我检查脚本时libcurl仍然连续几个小时连接到服务器.如果pycurl正确地超时,则套接字将被关闭.

import threading
import pycurl

def testf():
    c = pycurl.Curl()
    c.setopt(pycurl.CONNECTTIMEOUT,3)
    c.setopt(pycurl.NOSIGNAL,'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选项全部内容,希望文章能够帮你解决python – pycurl / curl不遵循CURLOPT_TIMEOUT选项所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶