Когда я запускаю nursery.start_soon (fetch ...), я печатаю данные в fetch, но как мне вернуть данные?Я не видел ничего похожего на функцию asyncio.gather (* tasks).
Вы задаете два разных вопроса, поэтому я просто отвечу на этот.Матиас уже ответил на другой ваш вопрос.
Когда вы звоните start_soon()
, вы просите Трио запустить задание в фоновом режиме, а затем продолжайте.Вот почему Trio может запускать fetch()
одновременно несколько раз.Но поскольку Trio продолжает работать, нет способа «вернуть» результат, как это обычно делает функция Python.куда бы он вообще вернулся?
Вы можете использовать очередь, чтобы задачи fetch()
могли отправлять результаты другой задаче для дополнительной обработки.
Чтобы создать очередь:
response_queue = trio.Queue()
Когда вы запускаете задачи извлечения, передайте очередь в качестве аргумента и отправьте sentintel в очередь, когда закончите:
async with trio.open_nursery() as nursery:
for i in networkIds:
nursery.start_soon(fetch, url.format(i), headers)
await response_queue.put(None)
После загрузки URL-адреса поместите ответ в очередь.:
async def fetch(url, headers, response_queue):
print("Start: ", url)
response = await s.get(url, headers=headers)
# Add responses to queue
await response_queue.put(response)
print("Finished: ", url, len(response.content), response.status_code)
С учетом вышеуказанных изменений ваши задачи извлечения будут помещать ответы в очередь.Теперь вам нужно прочитать ответы из очереди, чтобы вы могли обработать их.Для этого вы можете добавить новую функцию:
async def process(response_queue):
async for response in response_queue:
if response is None:
break
# Do whatever processing you want here.
Эту функцию процесса следует запускать как фоновую задачу, прежде чем запускать любые задачи извлечения, чтобы она обрабатывала ответы сразу после их получения.
Подробнее см. В разделе Синхронизация и обмен данными между задачами в документации Trio.