多线程的python请求

时间:2014-08-05 19:34:54

标签: python multithreading python-requests

我正在创建一个HTTP客户端,它可以每秒生成数百个连接,并在每个连接上发送最多10个请求。我正在使用线程,因此可以实现并发。 这是我的代码:

def generate_req(reqSession):
    requestCounter = 0
    while requestCounter < requestRate:
        try:
            response1 = reqSession.get('http://20.20.1.2/tempurl.html')
            if response1.status_code == 200:
                client_notify('r')
        except(exceptions.ConnectionError, exceptions.HTTPError, exceptions.Timeout) as Err:
            client_notify('F')
            break
        requestCounter += 1

def main():
    for q in range(connectionPerSec):
        s1 = requests.session()
        t1 = threading.Thread(target=generate_req, args=(s1,))
        t1.start()

的问题:

  1. 请求速率= 1时,它不会超过200个连接/秒。我在同一个客户端计算机上运行其他可用的HTTP客户端,并且在服务器上运行,测试运行正常并且能够扩展。

  2. 当requestRate = 10时,connections / sec降至30。 原因:无法每秒创建目标数量的线程。

  3. 对于问题#2,客户端计算机无法创建足够的请求会话并启动新线程。一旦requestRate设置为大于1,事情就会开始崩溃。 我怀疑它与请求使用的HTTP连接池有关。

    请在这里建议我做错了什么。

1 个答案:

答案 0 :(得分:1)

我无法解决问题,但以下代码有一些新功能:

1)扩展日志记录,包括特定的每线程信息

2)所有帖子join()在末尾编辑以确保父进程不会让它们挂起

3)多线程print倾向于交错消息,这可能是笨拙的。此版本使用yield,因此将来的版本可以接受这些消息并清楚地打印出来。

import exceptions, requests, threading, time

requestRate = 1
connectionPerSec = 2


def client_notify(msg):
    return time.time(), threading.current_thread().name, msg

def generate_req(reqSession):
    requestCounter = 0
    while requestCounter < requestRate:
        try:
            response1 = reqSession.get('http://127.0.0.1/')
            if response1.status_code == 200:
                print client_notify('r')
        except (exceptions.ConnectionError, exceptions.HTTPError, exceptions.Timeout):
            print client_notify('F')
            break
        requestCounter += 1

def main():
    for cnum in range(connectionPerSec):
        s1 = requests.session()
        th = threading.Thread(
            target=generate_req, args=(s1,),
            name='thread-{:03d}'.format(cnum),
        )
        th.start()

    for th in threading.enumerate():
        if th != threading.current_thread():
            th.join()


if __name__=='__main__':
    main()

输出

(1407275951.954147, 'thread-000', 'r')
(1407275951.95479, 'thread-001', 'r')