le funzioni asincrone si bloccano inaspettatamente

sto tentando di eseguire due funzioni in thread separati che non si bloccano a vicenda. ogni filo contiene un anello.

output del seguente codice:

%reset -f 

import asyncio
import time

async def run1():

    for i in range(0 , 3) :
        print('run1')
        time.sleep(1)

async def run2():

    for i in range(0 , 3) :
        print('run2')
        time.sleep(2)

async def main():
    results = await asyncio.gather(
        run1() , run2())

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop) 
loop.run_until_complete(main())

è: è:

run2
run2
run2
run1
run1
run1

ma può anche essere

run1
run1
run1
run2
run2
run2

così sembra che una volta uno dei thread run1 o run2 il thread blocchi l’altro thread di partenza fino a quando l’esecuzione corrente completa.

mi aspetto output simile a:

run1
run1
run2
run2
run1
run2

come permettere ai thread run1 e run2 di non bloccarsi?

sto usando Python3.

EN From: Async functions are unexpectedly blocking each other

More similar articles:

5 Comments

  1. succede anche di bloccare l’esecuzione dell’intero ciclo di eventi. in generale non si dovrebbe avere alcuna chiamata di blocco all’interno di una corutine. bloccherà il ciclo evento. invece quello che si vuole fare è await su un altro coroutine in modo che il ciclo di eventi sa passare a qualche altra coroutine nel frattempo.

  2. cambiare time.sleep alla corrispondente versione asyncio:

    await asyncio.sleep(1)

    e il risultato corretto del codice è:

    run1
    run2
    run1
    run2
    run1
    run2

    perché print accade prima di sleep.

  3. come regola generale, se la vostra coroutina non await nulla, è una coroutina solo nel nome, e si può essere sicuri che corre a completamento prima che passa il controllo al ciclo di eventi.

Leave a Reply

Your email address will not be published. Required fields are marked *