问题描述
我想在异步程序中发送具有不同参数的相同 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
),它使用 poolmanager
的 urllib
并返回一个 URL 的连接,我认为这部分会导致对相同 url 的不同参数的请求返回与请求的参数无关的响应。
经过一番搜索,我发现 futures_requests 似乎解决了这个问题,但仍然存在。我仍在寻找能够在异步程序中使用多线程请求的解决方案。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)