我在python 2.6上
HTTPD 2.2.15
CentOS 6
我正在编写一个python脚本,涉及进行大量REST API调用。我决定尝试通过多线程URL请求来提高程序的速度。我使用了请求模块,一切正常。我不得不切换到pycurl所以我复制了pycurl代码我有的工作。
现在,当我运行代码时,有时会在某些线程中出现错误。每次都不是相同的线程。通过注释掉除1以外的所有线程,我无法重现错误,但只需要2个或更多线程就可以显示错误。
我无法分享确切的代码,但这是一个近似值:
import os
import datetime
import time
import pycurl
import threading
from StringIO import StringIO
from pprint import pprint as pprint
import json
variable1 = {}
variable2 = {"x": {}, "y": {}}
def pycurl_method(url, creds):
buffer = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, url)
c.setopt(c.USERPWD, creds[0] + ':' + creds[1])
c.setopt(c.WRITEFUNCTION, buffer.write)
c.perform()
c.close()
response = buffer.getvalue()
return json.loads(response)
def url_method(url, creds):
env = threading.current_thread().getName()
response = pycurl_method(url, creds)
...Do stuff...
def start_threads(threads):
for thread in threads:
thread.start()
def join_threads(threads):
for thread in threads:
thread.join()
def main():
apiUrl0 = "some URL"
apiUrl1 = "some different URL"
apiUrl2 = "etc"
...
creds = #returns credentials from a file stored on the server as [username,password]
#Multithread API calls
t0 = threading.Thread(target=url_method, name='nameOfThread0', args=(apiUrl0, creds))
t1 = threading.Thread(target=url_method, name='nameOfThread1', args=(apiUrl1, creds))
t2 = threading.Thread(target=url_method, name='nameOfThread2', args=(apiUrl2, creds))
...
start_threads([t0, t1, t2, ...etc...])
join_threads([t0, t1, t2, ...etc...])
错误是这样的:
在url_method中输入“this_script.py”,第xyz行
c.perform()
错误:(77,'SSL CA证书问题(路径?访问权限?)')
如果我删除线程并按顺序执行,我没有错误
我认为这可能与pycurl有关(因为请求很好)
具体来说,pycurl.Curl()。
我想知道每个线程是否以某种方式使用相同的pycurl.Curl()并踩到其他线程的脚趾。
为什么会出现这些错误?
我怎么能避免它们呢?
线程和pycurl模块不能很好地协同工作吗?
答案 0 :(得分:0)
您发布的错误源自libcurl。 Python 2.6几年前已经结束了,你的pycurl和libcurl多大了?首先将libcurl和pycurl升级到当前版本。