日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python loop call soon_python3-asyncio 学习笔记 1 -- call_soon

發(fā)布時間:2025/3/13 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python loop call soon_python3-asyncio 学习笔记 1 -- call_soon 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近在學(xué)習(xí)python3 的?asyncio, 特將學(xué)習(xí)筆記記錄于此.

先來個簡單的例子:

import?asyncio

def?hello_world(loop):

print('Hello?World')

loop.stop()

loop?=?asyncio.get_event_loop()

#?Schedule?a?call?to?hello_world()

loop.call_soon(hello_world,?loop)

#?Blocking?call?interrupted?by?loop.stop()

loop.run_forever()

loop.close()

可以看到先是通過

asyncio.get_event_loop()

得到事件循環(huán),而這是 selector_events.BaseSelectorEventLoop 、base_events.BaseEventLoop 的一個實例.。之后調(diào)用?call_soon以達(dá)到立即執(zhí)行的目的,這個?call_soon來自base_events.BaseEventLoop ,實際的是拋給了?events.Handle,生成了一個 Handle的實例,實際執(zhí)行是?Handle._run, 但是在實例?Handle后并沒有立即調(diào)用_run,而是將生成的 Handle 實例添加到了?base_events.BaseEventLoop. _ready 中,直到調(diào)用

loop.run_forever()

才開始執(zhí)行, 那么這個 loop.run_forever() 做了啥?

def run_forever(self):

"""Run until stop() is called."""

self._check_closed()

if self.is_running():

raise RuntimeError('This event loop is already running')

if events._get_running_loop() is not None:

raise RuntimeError(

'Cannot run the event loop while another loop is running')

self._set_coroutine_wrapper(self._debug)

self._thread_id = threading.get_ident()

if self._asyncgens is not None:

old_agen_hooks = sys.get_asyncgen_hooks()

sys.set_asyncgen_hooks(firstiter=self._asyncgen_firstiter_hook,

finalizer=self._asyncgen_finalizer_hook)

try:

events._set_running_loop(self)

while True:

self._run_once()

if self._stopping:

break

finally:

self._stopping = False

self._thread_id = None

events._set_running_loop(None)

self._set_coroutine_wrapper(False)

if self._asyncgens is not None:

sys.set_asyncgen_hooks(*old_agen_hooks)

loop.run_forever() 先是檢查是否有正在運行的事件循環(huán), 保證同一時間只有一個loop運行,之后

try:

events._set_running_loop(self)

while?True:

self._run_once()

if?self._stopping:

break

可以看到是一直調(diào)用_run_once(),由于?_run_once()內(nèi)容較多這里就不再貼完整的代碼, 只摘抄關(guān)鍵的部分.

ntodo = len(self._ready)

for i in range(ntodo):

handle = self._ready.popleft()

if handle._cancelled:

continue

if self._debug:

pass # not care ...

else:

handle._run()

handle = None # Needed to break cycles when an exception occurs.

可以看出, 所有的call_soon遵循FIFO原則,不過這里還是會block的, 比如在前文中的hello_world中加入耗時的操作. 所以一旦想用異步,還是全部使用異步,要么0要么1.

總結(jié)

以上是生活随笔為你收集整理的python loop call soon_python3-asyncio 学习笔记 1 -- call_soon的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。