如何使用'pycurl'和'threading'模块在python 2.6中多线程处理URL请求?

时间:2018-03-13 17:55:18

标签: linux apache python-multithreading python-2.6 pycurl

我在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模块不能很好地协同工作吗?

1 个答案:

答案 0 :(得分:0)

您发布的错误源自libcurl。 Python 2.6几年前已经结束了,你的pycurl和libcurl多大了?首先将libcurl和pycurl升级到当前版本。