【发布时间】:2018-09-24 09:39:05
【问题描述】:
大家好, 我是 python 新手(我刚开始不到 2 周) 所以我需要一些建议和技巧:p
获取大约 1500 个 api 请求的最快和最有效的方法是什么?
- 使用异步函数执行它们并返回以获取 结果 ?
- 将它们分成 300 个 url 的列表,并将每个 线程内的列表将在异步循环内执行它们?
- 执行与第二个建议相同的操作,但使用进程 而不是线程?
目前它对我有用,但执行 1400 个 api 请求需要 8 秒,但是当我尝试没有线程的单个请求时需要 9 秒 我做错了什么??!
获取一个 URL(我尝试将 Session 作为参数传递,但在达到 700 个请求时出现错误)
async def fetch_one(url):
async with curio_http.ClientSession() as session:
response = await session.get(url)
content = await response.json()
return content
在异步循环中获取 URL 列表
async def fetchMultiURLs(url_list):
tasks = []
responses = []
for url in url_list:
task = await curio.spawn(fetch_one(url))
tasks.append(task)
for task in tasks:
content = await task.join()
responses.append(content)
print(content)
创建线程并在其中放入异步循环,具体取决于 URLs / X URL by Loop
例如 MultiFetch(URLS[600],200) 将创建 3 个线程,这些线程将按线程和异步方式调用 200 个请求
def MultiFetch(URLS,X):
MyThreadsList = []
MyThreadsResults = []
N_Threads = (lambda x: int (x/X) if (x % X == 0) else int(x/X)+1) (len(URLS))
for i in range( N_Threads ): # will iterate X = ListSize / X
MyThreadsList.append( Thread( target = curio.run , args = (fetchMultiURLs( (URLS[ i*X:(X*i+X)]) ) ,) ) )
MyThreadsList[i].start()
for i in range( N_Threads ):
MyThreadsResults.append(MyThreadsList[i].join())
return MyThreadsResults
【问题讨论】:
-
许多线程 + 队列是我所知道的最快的。 (一小时内 300 万个 http 请求 + 扫描)
-
非常感谢你的回答 :) 但这不是最有效的方法,因为在 Python 中,GIL 问题对这种请求的速度太慢了:p(我试过你的想法,它需要 11 秒才能完成做)
标签: python python-3.x api curl async-await