微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python在多线程中运行对相同网址的请求

如何解决Python在多线程中运行对相同网址的请求

我想在异步程序中发送具有不同参数的相同 url 的多线程请求。目前我的代码如下所示:

from requests_futures.sessions import FuturesSession
import asyncio

async def main():
    session = FuturesSession(max_workers=100)

    params = ['foo{}'.format(i) for i in range(1000)]

    url = 'some_host'

    async def send_request(param):
        f = session.get(url,params={'param': param})

        t = asyncio.ensure_future(asyncio.wrap_future(f))

        r = await t

        # check t is the request you expected,for example check that if you 
        # request for foo1 you are receiving foo1 object,but sometimes
        # returns value for different parameters                                                                                                                                

        return r

    tasks = []

    for param in params:
        tasks.append(
            asyncio.ensure_future(send_request(param))
        )

    await asyncio.wait(tasks,return_when=asyncio.ALL_COMPLETED)

例如 this link 所述,请求会话不是线程安全的,但是通过检查请求代码我发现即使为每个线程创建一个会话,甚至为每个请求创建一个会话仍然可以由于这部分代码,对于相同的 url 线程可能会导致问题:

conn = self.poolmanager.connection_from_url(url)

这一行来自 requests 模块(来自文件 get_connection函数 adapters.py),它使用 poolmanagerurllib 并返回一个 URL 的连接,我认为这部分会导致对相同 url 的不同参数的请求返回与请求的参数无关的响应。

经过一番搜索,我发现 futures_requests 似乎解决了这个问题,但仍然存在。我仍在寻找能够在异步程序中使用多线程请求的解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。