Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

asyncio RuntimeError: Event loop is closed

+4 votes

Bon, un truc relou que je croise 2 fois à 2 endroits différents m'ont sauté aux yeux.

sur ansible et python, la doc qui illustre des fonctions qui ne sont pas disponible dans les releases sorties ...

sur ansible je me disais "passons" mais voir cette façon de faire sur python ...

je voulais tester asyncio avec des tasks comme ceci https://docs.python.org/3/library/asyncio-task.html (en python 3.4.3)

     import asyncio

@asyncio.coroutine
def factorial(name, number):
    f = 1
    for i in range(2, number+1):
    print("Task %s: Compute factorial(%s)..." % (name, i))
    yield from asyncio.sleep(1)
    f *= i
    print("Task %s: factorial(%s) = %s" % (name, number, f))

loop = asyncio.get_event_loop()
tasks = [
    asyncio.ensure_future(factorial("A", 2)),
    asyncio.ensure_future(factorial("B", 3)),
    asyncio.ensure_future(factorial("C", 4))]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

seulement ca marche pas parce que ensure_future n'est dispo qu'en 3.4.4 ; mais la 3.4.4 n'EXISTE PAS !

alors je descends un poil plus bas la doc et tombe sur

asyncio.async(coro_or_future, *, loop=None)

    A deprecated alias to ensure_future().

    Deprecated since version 3.4.4.

donc je fais

@asyncio.coroutine
def factorial(name, number):
    f = 1
    for i in range(2, number+1):
    print("Task %s: Compute factorial(%s)..." % (name, i))
    yield from asyncio.sleep(1)
    f *= i
    print("Task %s: factorial(%s) = %s" % (name, number, f))

loop = asyncio.get_event_loop()
tasks = [
    asyncio.async(factorial("A", 2)),
    asyncio.async(factorial("B", 3)),
    asyncio.async(factorial("C", 4))]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

et là

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/usr/local/lib/python3.4/asyncio/tasks.py", line 511, in async
    task = loop.create_task(coro_or_future)
  File "/usr/local/lib/python3.4/asyncio/base_events.py", line 211, in create_task
    self._check_closed()
  File "/usr/local/lib/python3.4/asyncio/base_events.py", line 265, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

alors comment on gere ? ou oublie tasks ?

demandé 11-Nov-2015 par foxmask (2,772 points)

Je viens d'executer une version legerement modifiée de ton code et tout baigne. Je suis sous Debian 8, et j'utilise python 3.4.2

import asyncio

@asyncio.coroutine
def factorial(name, number):
    f = 1
    for i in range(2, number+1):
        print("Task %s: Compute factorial(%s)..." % (name, number))
        yield from asyncio.sleep(1)
        f *= i
    print("Task %s: factorial(%s) = %s" % (name, number, f))

loop = asyncio.get_event_loop()
tasks = [
    # asyncio.ensure_future(factorial("A", 2)),
    # asyncio.ensure_future(factorial("B", 3)),
    # asyncio.ensure_future(factorial("C", 4))
    asyncio.async(factorial("A", 2)),
    asyncio.async(factorial("B", 3)),
    asyncio.async(factorial("C", 4))
]

loop.run_until_complete(asyncio.wait(tasks))
loop.close()

(py34) ~/GITHUB/asyncio_test master+? 
⇒ python -V
Python 3.4.2
(py34) ~/GITHUB/asyncio_test master+? 
⇒ python again_test.py 
Task A: Compute factorial(2)...
Task B: Compute factorial(3)...
Task C: Compute factorial(4)...
Task A: factorial(2) = 2
Task B: Compute factorial(3)...
Task C: Compute factorial(4)...
Task B: factorial(3) = 6
Task C: Compute factorial(4)...
Task C: factorial(4) = 24
(py34) ~/GITHUB/asyncio_test master+? 
⇒ 

Le seul truc que je peux te conseiller pr l'instant, c'est d'activer le mode debug durant ton developpement

Le truc ici c'est que c'est pas mon code... C'est ni plus ni moins que celui de la doc asyncio elle même :-/

trollé par le manuel -_-'

Votre réponse

Preview

Votre nom à afficher ( en option ):
Vie privée: . Votre adresse de messagerie ne sera utilisée que pour l'envoi de ces notifications .
Vérification anti -spam:
Pour éviter cette vérification à l'avenir, Connectez vous ou inscrivez vous.
...