MagicStack / MagicStack/uvloop

How to stop event loop in child thread ?

Ouverte
#370 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Cython
Étoiles
11.9k
Forks
615
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

I call the stop method in child thread,but loop’s state is running ~
Can you help me ?

import time
import asyncio
import threading
from functools import partial

import sanic
import uvloop


class ApiService:

    def __init__(self):
        self.__server = None
        self.__loop = None

    def _thread_main(self, loop):
        app = sanic.Sanic("Api")
        asyncio.set_event_loop(loop)
        serv_coro = app.create_server(
            host="0.0.0.0", port=8080, return_asyncio_server=True, debug=False
        )

        serv_task = asyncio.ensure_future(serv_coro, loop=self.__loop)
        self.__server = self.__loop.run_until_complete(serv_task)
        self.__server.after_start()
        self.__loop.run_forever()

    def run(self):
        self.__loop = uvloop.new_event_loop()
        # print(dir(self.__loop))
        # self._thread_main(self.__loop)
        thread = threading.Thread(
            target=partial(self._thread_main, self.__loop), name="api-service"
        )
        thread.setDaemon(True)
        thread.start()
        # thread.join()

    def stop(self):
        if self.__loop is None or self.__server is None:
            return

        self.__loop.stop()
        self.__server.before_stop()
        print(self.__loop)
        # Wait for server to close
        self.__loop.run_until_complete(self.__server.close())

        # Complete all tasks on the loop
        for connection in self.__server.connections:
            connection.close_if_idle()
        self.__server.after_stop()


if __name__ == '__main__':

    app = ApiService()
    try:
        app.run()
        while True:
            time.sleep(10)
    except (KeyboardInterrupt, InterruptedError) as _:
        print(app._ApiService__loop)
    except Exception as e:
        pass
    finally:
        app.stop()
  • uvloop:0.14.0:
  • python:3.7.2:
  • MacOS10.15.7:

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par reproduire l’interaction entre _thread_main, run_forever et stop avec l’environnement fourni composé de Python 3.7.2, uvloop 0.14.0 et macOS. Examinez les appels du cycle de vie de la boucle et du serveur présentés dans l’issue, puis vérifiez si l’arrêt depuis le thread parent se termine correctement. Documentez le comportement pris en charge ou la modification requise.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
backend
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
30/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.