在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是事件循環

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-11-01 10:00 ? 次閱讀

Python的Asyncio模塊提供了管理事件、協程、任務和線程的方法,以及編寫并發代碼的原語。此模塊的主要組件和概念包括:

  • 事件循環 : 在Asyncio模塊中,每一個進程都有一個事件循環。
  • 協程 : 這是子程序的泛化概念。協程可以在執行期間暫停,這樣就可以等待外部的處理(例如IO)完成之后,從之前暫停的地方恢復執行。
  • Futures : 定義了 Future 對象,和 concurrent.futures 模塊一樣,表示尚未完成的計算。
  • Tasks : 這是Asyncio的子類,用于封裝和管理并行模式下的協程。

本節中重點討論事件,事實上,異步編程的上下文中,事件無比重要。因為事件的本質就是異步。

1. 什么是事件循環

在計算系統中,可以產生事件的實體叫做事件源,能處理事件的實體叫做事件處理者。

此外,還有一些第三方實體叫做事件循環。它的作用是管理所有的事件,在整個程序運行過程中不斷循環執行,追蹤事件發生的順序將它們放到隊列中,當主線程空閑的時候,調用相應的事件處理者處理事件。

最后,我們可以通過下面的偽代碼來理解事件循環:

while(1) {
  events = getEvents();
  for (e in events)
    processEvent(e);
}

所有的事件都在 ** while **循環中捕捉,然后經過事件處理者處理。事件處理的部分是系統唯一活躍的部分,當一個事件處理完成,流程繼續處理下一個事件。

2. 準備工作

Asyncio提供了以下方法來管理事件循環:

  1. ** loop = get_event_loop() ** : 得到當前上下文的事件循環。
  2. ** loop.call_later(time_delay, callback, arg) ** : 延后 time_delay 秒再執行 callback 方法。
  3. ** loop.call_soon(callback, argument) ** : 盡可能快調用 callback, call_soon() 函數結束,主線程回到事件循環之后就會馬上調用 callback 。
  4. ** loop.time() ** : 以float類型返回當前事件循環的內部時間。
  5. ** asyncio.set_event_loop() ** : 為當前上下文設置事件循環。
  6. ** asyncio.new_event_loop() ** : 根據此策略創建一個新的事件循環并返回。
  7. ** loop.run_forever() **: 在調用 stop() 之前將一直運行。

3. 如何做…

下面的代碼中,我們將展示如何使用Asyncio庫提供的事件循環創建異步模式的應用。

import asyncio
import datetime
import time

def function_1(end_time, loop):
    print("function_1 called")
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, function_2, end_time, loop)
    else:
        loop.stop()

def function_2(end_time, loop):
    print("function_2 called ")
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, function_3, end_time, loop)
    else:
        loop.stop()

def function_3(end_time, loop):
    print("function_3 called")
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, function_1, end_time, loop)
    else:
        loop.stop()

def function_4(end_time, loop):
    print("function_5 called")
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, function_4, end_time, loop)
    else:
        loop.stop()

loop = asyncio.get_event_loop()

end_loop = loop.time() + 9.0
loop.call_soon(function_1, end_loop, loop)
# loop.call_soon(function_4, end_loop, loop)
loop.run_forever()
loop.close()

運行結果如下:

python3 event.py
function_1 called
function_2 called
function_3 called
function_1 called
function_2 called
function_3 called
function_1 called
function_2 called
function_3 called

在這個例子中,我們定義了三個異步的任務,相繼執行,入下圖所示的順序。

圖片

首先,我們要得到這個事件循環:

loop = asyncio.get_event_loop()

然后我們通過** call_soon **方法調用了 ** function_1() ** 函數。

end_loop = loop.time() + 9.0
loop.call_soon(function_1, end_loop, loop)

讓我們來看一下 ** function_1() ** 的定義:

def function_1(end_time, loop):
    print("function_1 called")
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, function_2, end_time, loop)
    else:
        loop.stop()

這個函數通過以下參數定義了應用的異步行為:

  1. **end_time ** : 定義了 function_1() 可以運行的最長時間,并通過 call_later 方法傳入到 function_2() 中作為參數
  2. **loop ** : 之前通過 get_event_loop() 方法得到的事件循環。

** function_1() ** 的任務非常簡單,只是打印出函數名字。當然,里面也可以寫非常復雜的操作。

print("function_1 called")

任務執行結束之后,它將會比較 ** loop.time() ** **+1s 和設定的運行時間,如果沒有超過,使用call_later **在1秒之后執行 ** function_2() **

if (loop.time() + 1.0) < end_time:
    loop.call_later(1, function_2, end_time, loop)
else:
    loop.stop()

其中**function_2() **和 ****function_3() **** 的作用類似。如果運行的時間超過了設定,事件循環終止。

loop.run_forever()
loop.close()
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2736

    瀏覽量

    47796
  • 程序
    +關注

    關注

    117

    文章

    3798

    瀏覽量

    81461
  • 代碼
    +關注

    關注

    30

    文章

    4837

    瀏覽量

    69128
  • python
    +關注

    關注

    56

    文章

    4811

    瀏覽量

    85076
收藏 人收藏

    評論

    相關推薦

    066. while循環:5.1 循環章節課程介紹

    循環
    充八萬
    發布于 :2023年07月05日 15:47:47

    067. while循環:5.2 了解循環

    循環
    充八萬
    發布于 :2023年07月05日 15:48:56

    066. while循環:5.1 循環章節課程介紹

    循環
    充八萬
    發布于 :2023年07月07日 03:42:29

    074. while循環:5.9 循環的注意事項

    循環
    充八萬
    發布于 :2023年07月07日 06:56:17

    系統的消息循環

    系統的消息循環 一、 實驗目的學習使用系統的消息循環。掌握如何通過系統的消息循環來響應鍵盤的消息,同時學會使用圖形模式
    發表于 12-25 23:56 ?1123次閱讀
    系統的消息<b class='flag-5'>循環</b>

    循環碼,循環碼是什么意思

    循環碼,循環碼是什么意思 循環碼是
    發表于 03-18 14:00 ?9916次閱讀

    在LabVIEW中使用的2種循環結構While循環和For循環的詳細資料概述

    在程序設計中,如果需要重復執行一段代碼,就需要使用循環結構。接下來我們將介紹在 LabVIEW 中常常使用的 2 種循環結構 While 循環和 For 循環。
    發表于 06-19 08:00 ?33次下載
    在LabVIEW中使用的2種<b class='flag-5'>循環</b>結構While<b class='flag-5'>循環</b>和For<b class='flag-5'>循環</b>的詳細資料概述

    Python的while循環是什么

    Python中有2種循環。一種循環次數明確,另一種循環次數不明確。`for循環`的循環重復次數是`明確的`,遍歷對象里有幾個元素,
    的頭像 發表于 02-23 11:15 ?1333次閱讀

    while循環

    while 循環定義:“當…時候,執行某段程序”。當給定的條件為真時,執行循環體;條件為假時,結束循環。
    的頭像 發表于 02-23 14:02 ?3119次閱讀
    while<b class='flag-5'>循環</b>

    C語言循環的比較

    一個循環體內又包含另一個完整的循環結構,稱為循環的嵌套。內嵌的循環體中還可以嵌套循環,這就是多層循環
    的頭像 發表于 03-09 11:16 ?843次閱讀

    WHILE ...ENDWHILE:編程設定當型循環 .EXIT:離開循環,無條件退出循環.

    當型循環。一直重復指令塊直到滿足了特定條件的循環。如果不滿足條件,則用 ENDWHILE 后的下一個指令繼續程序。在每次循環執行之前檢查條件。如果從一開始就不滿足條件,則不執行指令塊。循環
    的頭像 發表于 05-12 15:57 ?2936次閱讀
    WHILE ...ENDWHILE:編程設定當型<b class='flag-5'>循環</b> .EXIT:離開<b class='flag-5'>循環</b>,無條件退出<b class='flag-5'>循環</b>.

    for in range循環怎么使用

    for-in range 循環是Python中的一種循環結構,用于重復執行一段代碼,而且循環次數是已知的。 在Python中,for-in range 循環有以下幾種用法: 通過指定
    的頭像 發表于 11-21 14:49 ?1.4w次閱讀

    python怎么設置循環次數

    在Python中,可以使用循環語句來重復執行一段代碼多次。要設置循環次數,可以使用循環的計數器來控制循環的執行次數。以下是幾種常用的設置循環
    的頭像 發表于 11-23 15:50 ?5463次閱讀

    循環指令loop規定循環次數

    循環指令是計算機編程中非常重要的概念,它允許程序重復執行一段代碼塊,使得程序可以更有效地處理大量數據和重復性任務。在本文中,我們將詳盡、詳實、細致地介紹循環指令的相關概念、語法和應用場
    的頭像 發表于 02-14 16:10 ?1834次閱讀

    什么是PLC循環移位指令 PLC循環移位的特點

    PLC循環移位指令包括循環左移指令和循環右移指令。在循環移位過程中,移出的位并不會丟失,而是會放回空出的位上,形成一個環形移位。
    的頭像 發表于 03-07 16:57 ?2335次閱讀
    什么是PLC<b class='flag-5'>循環</b>移位指令 PLC<b class='flag-5'>循環</b>移位的特點
    主站蜘蛛池模板: 久久99综合| 四虎国产精品成人永久免费影视 | 欧美一级高清黄图片 | 天堂资源在线播放 | 天天操天天射天天 | 国产成人精品曰本亚洲77美色 | 色香影院 | 日不卡 | 人人乳乳香蕉大免费 | 在线最新版www资源网 | 国产小毛片 | 五月天婷婷伊人 | 同性恋激情视频 | 综合五月婷婷 | 国产精品久久久亚洲456 | 性夜黄a爽影免费看 | 亚洲视频www| 免费成人看片 | 国产一区二区三区夜色 | 福利99 | 国产手机在线 | 日本a级特黄三级三级三级 日本边添边爱边摸边做边爱 | ass嫩美女胴体 | 天天看天天摸色天天综合网 | 亚洲一二三区视频 | 特级毛片免费视频观看 | 中日韩在线视频 | 天天操夜夜噜 | 老师办公室高h文小说 | 全部在线播放免费毛片 | 日韩第五页 | 国产高清一区二区 | www五月天com| 亚洲女同一区二区 | 人人插人人爱 | 久久五月天婷婷 | 俺去啦最新网址 | 丁香六月激情综合 | 狠狠色影院 | 日本一区免费在线观看 | 伊人久久大香线蕉综合亚洲 |