Maison > Article > développement back-end > Comment utiliser les fonctions communes asyncio de Python ?
Vous devez utiliser l'instruction def asynchrone
Ce que la coroutine peut faire :
1 Attendre un résultat futur
2. Attendre une autre coroutine (produire un résultat ou déclencher une exception)
3. , générez un résultat pour la coroutine qui l'attend
4. Lancez une exception à la coroutine qui l'attend
Appelez la fonction coroutine, la coroutine ne commencera pas à s'exécuter, mais reviendra simplement un objet coroutine
Il existe deux façons de laisser l'objet coroutine s'exécuter :
1 Utilisez await
pour l'attendre dans une autre coroutine déjà en cours d'exécution await
等待它
2、通过ensure_future
函数计划它的执行
只有某线程的loop运行了,协程才可能运行
下面的例子:
先拿到当前线程缺省的loop,然后将协程对象交给loop.run_until_complete,协程对象随后会在loop里得到运行
loop = asyncio.get_event_loop() loop.run_until_complete(do_some_work(3))
run_until_complete
是一个阻塞调用,知道协程运行结束才返回
它的参数是一个future,但是我们传给它的却是协程对象,它在内部做了检查,通过ensure_future函数把协程对象包装成了future
我们可以这样写:
loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))
多个协程在一个loop里运行,为了把多个协程交给loop,需要借助asyncio.gathre
ensure_futureLa fonction planifie son exécution<p></p>Ce n'est que lorsque la boucle d'un certain thread est en cours d'exécution que la coroutine peut s'exécuter<p></p>L'exemple suivant :<h3></h3>Obtenez d'abord la boucle par défaut du thread actuel, puis transmettez l'objet coroutine à boucler. run_until_complete, L'objet coroutine sera alors exécuté dans la boucle<p><pre class="brush:py;">loop.run_until_complete(asyncio.gather(do_some_work(1), do_some_work(3)))</pre></p>
<code>run_until_complete
est un appel bloquant il ne reviendra que lorsque la coroutine sera terminée. Son paramètre est un futur, mais ce qu'on lui passe. is L'objet coroutine est vérifié en interne et l'objet coroutine est empaqueté dans un futur via la fonction Ensure_futureNous pouvons écrire comme ceci :loop = asyncio.get_event_loop() #获取当前线程loop coros_list = [] for i in range(2000): coros_list.append(main(i)) loop.run_until_complete(asyncio.gather(*coros_list))
asyncio.gathre
loop = asyncio.get_event_loop() #获取当前线程loop loop.run_until_complete(do_some_work(loop, 1)) loop.run_until_complete(do_some_work(loop, 3)) loop.close()
loop = asyncio.get_event_loop() #获取当前线程loop loop.run_until_complete(do_some_work(loop, 1)) loop.close() loop.run_until_complete(do_some_work(loop, 3)) # 此处异常gather joue le rôle d'agrégation de futurs multiples. sont regroupés dans un seul futur car loop.run_until_complete n'accepte qu'un seul futur. À propos de loop.close()Pour faire simple, tant que la boucle n'est pas fermée, elle peut toujours s'exécuter. :
def done_callback(futu): print('Done') futu = asyncio.ensure_future(do_some_work(3)) futu.add_done_callback(done_callback) loop.run_until_complete(futu)Mais s'il est fermé, il ne peut plus fonctionner :
Rejoindre la coroutine est une opération de lecture IO Une fois la lecture des données terminée, nous espérons être avertis pour la prochaine étape du traitement des données. . Cela peut être implémenté en ajoutant des rappels au futurasyncio.get_running_loop() # 返回当前os线程中正在运行的事件循环 asyncio.get_event_loop() # 获取当前事件循环 asyncio.set_event_loop(loop) # 获取当前事件循环 asyncio.new_event_loop() # 创建并返回一个新的事件循环对象Callback
loop = asyncio.new_event_loop() asyncio.set_event_loop(loop)Boucle d'événements
asyncio.get_event_loop()
Si : 🎜🎜🎜🎜Le fil actuel est le fil principal🎜🎜🎜🎜Le fil actuel ne démarre pas la boucle d'événement🎜🎜🎜🎜Appeler un syncio .get_event_loop ()Method meeting Générez une nouvelle boucle d'événements par défaut et définissez-la comme boucle d'événements du thread actuel. 🎜🎜À l'heure actuelle, get_event_loop() équivaut à : 🎜rrreeeCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!