我正在尝试以异步方式使用Python,以便加快对服务器的请求。服务器的响应时间很慢(通常为几秒钟,但有时也快于一秒钟),但并行运行良好。我无权访问此服务器,也无法更改任何内容。因此,我有一个很大的URL列表(在下面的代码中pages),这些列表是我事先知道的,并且希望通过一次发出NO_TASKS=5请求来加快它们的加载速度。另一方面,我不想使服务器超载,因此我希望每个请求之间的最小间隔为1秒(即每秒1个请求的限制)。
到目前为止,我已经使用Trio队列成功实现了信号量部分(一次五个请求)。
import asks
import time
import trio
NO_TASKS = 5
asks.init('trio')
asks_session = asks.Session()
queue = trio.Queue(NO_TASKS)
next_request_at = 0
results = []
pages = [
'https://www.yahoo.com/',
'http://www.cnn.com',
'http://www.python.org',
'http://www.jython.org',
'http://www.pypy.org',
'http://www.perl.org',
'http://www.cisco.com',
'http://www.facebook.com',
'http://www.twitter.com',
'http://www.macrumors.com/',
'http://arstechnica.com/',
'http://www.reuters.com/',
'http://abcnews.go.com/',
'http://www.cnbc.com/',
]
async def async_load_page(url):
global next_request_at
sleep = next_request_at
next_request_at = max(trio.current_time() + 1, next_request_at)
await trio.sleep_until(sleep)
next_request_at = max(trio.current_time() + 1, next_request_at)
print('start loading page {} at {} seconds'.format(url, trio.current_time()))
req = await asks_session.get(url)
results.append(req.text)
async def producer(url):
await queue.put(url)
async def consumer():
while True:
if queue.empty():
print('queue empty')
return
url = await queue.get()
await async_load_page(url)
async def main():
async with trio.open_nursery() as nursery:
for page in pages:
nursery.start_soon(producer, page)
await trio.sleep(0.2)
for _ in range(NO_TASKS):
nursery.start_soon(consumer)
start = time.time()
trio.run(main)
但是,我缺少限制部分的实现,即max。的实现。每秒1个请求。您可以在我尝试这样做的上方看到(的前五行async_load_page)
九州编程
胡说叔叔
相关分类