简体   繁体   English

多线程的python请求

[英]python-requests with multithreading

I am working on creating a HTTP client which can generate hundreds of connections each second and send up to 10 requests on each of those connections. 我正在创建一个HTTP客户端,它可以每秒生成数百个连接,并在每个连接上发送最多10个请求。 I am using threading so concurrency can be achieved. 我正在使用线程,因此可以实现并发。 Here is my code: 这是我的代码:

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()

Issues: 问题:

  1. It is not scaling above 200 connections/sec with requestRate = 1. I ran other available HTTP clients on the same client machine and against the server, test runs fine and it is able to scale. 在requestRate = 1的情况下,它不会超过200个连接/秒。我在同一个客户端计算机上运行其他可用的HTTP客户端,并且在服务器上运行,测试运行正常并且能够扩展。

  2. When requestRate = 10, connections/sec drops to 30. Reason: Not able to create targeted number of threads every second. 当requestRate = 10时,connections / sec降至30.原因:无法每秒创建目标数量的线程。

For issue #2, client machine is not able to create enough request sessions and start new threads. 对于问题#2,客户端计算机无法创建足够的请求会话并启动新线程。 As soon as requestRate is set to more than 1, things start to fall apart. 一旦requestRate设置为大于1,事情就会开始崩溃。 I am suspecting it has something to do with HTTP connection pooling which requests uses. 我怀疑它与请求使用的HTTP连接池有关。

Please suggest what am I doing wrong here. 请在这里建议我做错了什么。

I wasn't able to get things to fall apart, however the following code has some new features: 我无法解决问题,但以下代码有一些新功能:

1) extended logging, including specific per-thread information 1)扩展日志记录,包括特定的每线程信息

2) all threads join() ed at the end to make sure the parent process doesntt leave them hanging 2)所有线程在末尾join() ,以确保父进程不会挂起它们

3) multithreaded print tends to interleave the messages, which can be unwieldy. 3)多线程print倾向于交错消息,这可能是笨拙的。 This version uses yield so a future version can accept the messages and print them clearly. 此版本使用yield因此将来的版本可以接受消息并清楚地打印它们。

source 资源

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()

output 产量

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM