2016-12-23 4 views
0

Я только что узнал асинхронный с python 3.5 вчера.Asyncio on long running task

вот что я хочу достичь сегодня.

import asyncio 
import time 
import requests 

async def foo(): 
    """Some Long Running Taks""" 
    requests.get("http://stackoverflow.com/questions/41301031/asyncio-on-long-running-task") 
    print("foo") 

async def bar(): 
    """Some Quick Task""" 
    print("bar") 

while True: 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(asyncio.gather(foo(), bar())) 
    loop.close() 
    time.sleep(2) 

#Expected output 
""" 
>>>bar 
>>>bar 
>>>bar 
>>>bar 
>>>bar 
>>>foo 
and so on 
""" 

Возможно ли это использовать python async/wait?

+1

'run_until_complete' загораживающим. Следующая итерация цикла while не начнется, пока все, что вы соберете, не будет завершено. – dirn

ответ

1

У вас есть несколько вопросов, в вашем коде:

  1. запросов не поддерживает asyncio, использовать aiohttp вместо этого.

  2. Ваш couroutines будет работать только тогда, когда цикл выполняется: Call loop.run_until_complete() только один раз в вашем коде, и планировать много (короткие или длинные) задачи с использованием await (или asycio.ensure_future() или loop.create_task()).

Вот пример делает что-то подобное тому, что вы пытаетесь сделать:

# make sure to run `pip install aiohttp` first!!! 

import asyncio 

import aiohttp 


async def slow_fetch(delay): 
    url = "http://httpbin.org/delay/{}".format(delay) 
    print("Getting ", url) 
    async with aiohttp.ClientSession() as session: 
     async with session.get(url) as resp: 
      text = await resp.text() 
    print("Got {}, {} chars".format(url, len(text))) 


async def quick_loop(): 
    print("enter quick_loop") 
    for i in range(10): 
     await asyncio.sleep(1) 
     print("quick_loop", i) 
    print("exit quick_loop") 


loop = asyncio.get_event_loop() 
loop.run_until_complete(asyncio.gather(
    slow_fetch(3), 
    slow_fetch(4), 
    quick_loop(), 
)) 
loop.close() 
0

Ваш time.sleep() блокируется; вам нужно использовать asyncio.sleep().

и почему вы запускаете свой loop внутри while True?

также обратите внимание, что asyncio поможет только ускорить выполнение заданий io-bound (например, получить данные из сети). это не поможет вам ускорить задачи, связанные с процессором. для этого вам необходимо threads или multiplrocessing.

видя, что вы обновили свой вопрос, здесь небольшое обновление в моем ответе: также requests блокирует и не играет хорошо с asyncio. aiohttp является похож по функциональности, но играет хорошо с asyncio

+0

time.sleep() - это просто показать, что это долго работающая задача. Вы можете заменить его на любые веб-запросы. – Rahul

+0

см. Редактирование, если вы понимаете. – Rahul

+0

Спасибо за указание так-документации – Rahul