最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Python 的線程中運行協(xié)程的方法

 更新時間:2020年02月24日 12:24:40   作者:kingname  
這篇文章主要介紹了在Python 的線程中運行協(xié)程的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

在一篇文章 理解Python異步編程的基本原理 這篇文章中,我們講到,如果在異步代碼里面又包含了一段非常耗時的同步代碼,異步代碼就會被卡住。

那么有沒有辦法讓同步代碼與異步代碼看起來也是同時運行的呢?方法就是使用事件循環(huán)的.run_in_executor()方法。

我們來看一下 Python 官方文檔[1]中的說法:

那么怎么使用呢?還是以非常耗時的遞歸方式計算斐波那契數(shù)列的這個函數(shù)為例:

def sync_calc_fib(n): 
 if n in [1, 2]: 
 return1 
 return sync_calc_fib(n - 1) + sync_calc_fib(n - 2) 
async def calc_fib(n): 
 result = sync_calc_fib(n) 
 print(f'第 {n} 項計算完成,結(jié)果是:{result}') 
 return result 

我們現(xiàn)在需要用 aiohttp 訪問一個延遲5秒的網(wǎng)頁,同時計算斐波那契數(shù)列第36項。

首先我們看看單獨計算第36項需要5秒鐘:

我們再來看看如果直接把這計算斐波那契數(shù)列和請求網(wǎng)站的兩個異步任務(wù)放在一起“并行”,實際時間是兩個任務(wù)的時間疊加:

具體原因我在上一篇文章里面已經(jīng)做了說明。

現(xiàn)在,我想讓兩個任務(wù)“同時運行”,于是就可以這樣修改代碼:

import aiohttp 
import asyncio 
import time 
from concurrent.futures import ThreadPoolExecutor 
async def request(sleep_time): 
 async with aiohttp.ClientSession() as client: 
 resp = await client.get(f'http://127.0.0.1:8000/sleep/{sleep_time}') 
 resp_json = await resp.json() 
 print(resp_json) 
def sync_calc_fib(n): 
 if n in [1, 2]: 
 return 1 
 return sync_calc_fib(n - 1) + sync_calc_fib(n - 2) 
def calc_fib(n): 
 result = sync_calc_fib(n) 
 print(f'第 {n} 項計算完成,結(jié)果是:{result}') 
 return result 
async def main(): 
 start = time.perf_counter() 
 loop = asyncio.get_event_loop() 
 with ThreadPoolExecutor(max_workers=4) as executor: 
 tasks_list = [ 
  loop.run_in_executor(executor, calc_fib, 36), 
  asyncio.create_task(request(5)) 
 ] 
 await asyncio.gather(*tasks_list) 
 end = time.perf_counter() 
 print(f'總計耗時:{end - start}') 
asyncio.run(main()) 

運行效果如下圖所示:

在5秒鐘的時間,就把計算斐波那契數(shù)列和請求5秒延遲的網(wǎng)站都做完了。

實現(xiàn)這樣的轉(zhuǎn)變,關(guān)鍵的代碼就是:loop.run_in_executor(executor, calc_fib, 36)

其中的 loop就是主線程的事件循環(huán)(event loop),它是用來調(diào)度同一個線程里面的多個協(xié)程。

executor是我們使用ThreadPoolExecutor(max_workers=4)創(chuàng)建的一個有4個線程的線程池,calc_fib是一個耗時的同步函數(shù),36是傳入calc_fib的參數(shù)。loop.run_in_executor(executor, calc_fib, 36)的意思是說:

  • 把calc_fib函數(shù)放到線程池里面去運行
  • 給線程池增加一個回調(diào)函數(shù),這個回調(diào)函數(shù)會在運行結(jié)束后的下一次事件循環(huán)把結(jié)果保存下來。

請注意上圖中紅色箭頭對應(yīng)的calc_fib這是一個同步函數(shù),請與上一篇文章中的異步函數(shù)區(qū)分開。run_in_executor的第二個參數(shù)需要是一個同步函數(shù)的函數(shù)名。

在上面的例子中,我們創(chuàng)建的是有4個線程的線程池。所以這個線程池最多允許4個阻塞式的同步函數(shù)“并行”。

總結(jié)

到此這篇關(guān)于在Python 的線程中運行協(xié)程的方法的文章就介紹到這了,更多相關(guān)python線程中運行協(xié)程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實現(xiàn)定時任務(wù)的八種方案詳解

    Python實現(xiàn)定時任務(wù)的八種方案詳解

    在日常工作中,我們常常會用到需要周期性執(zhí)行的任務(wù),我們可以用Python直接實現(xiàn)這一功能。本文整理的是常見的Python定時任務(wù)的八種實現(xiàn)方式,需要的朋友可以參考一下
    2022-02-02
  • python判斷字符串是否包含子字符串的方法

    python判斷字符串是否包含子字符串的方法

    這篇文章主要介紹了python判斷字符串是否包含子字符串的方法,實例分析了Python中的in與find方法來實現(xiàn)這一功能,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • 用Python爬取指定關(guān)鍵詞的微博

    用Python爬取指定關(guān)鍵詞的微博

    這篇文章主要介紹了用Python爬取指定關(guān)鍵詞的微博,下面文章圍繞Python爬取指定關(guān)鍵詞的微博的相關(guān)資料展開詳細內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 詳解Python驗證碼識別

    詳解Python驗證碼識別

    這幾天在寫一個程序的時候需要識別驗證碼,因為程序是Python寫的自然打算用Python進行驗證碼的識別。下面把實現(xiàn)思路分享在腳本之家平臺,感興趣的朋友可以參考下
    2016-01-01
  • python統(tǒng)計字母、空格、數(shù)字等字符個數(shù)的實例

    python統(tǒng)計字母、空格、數(shù)字等字符個數(shù)的實例

    今天小編就為大家分享一篇python統(tǒng)計字母、空格、數(shù)字等字符個數(shù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python如何爬取網(wǎng)站數(shù)據(jù)并進行數(shù)據(jù)可視化

    python如何爬取網(wǎng)站數(shù)據(jù)并進行數(shù)據(jù)可視化

    這篇文章主要介紹了python爬取拉勾網(wǎng)數(shù)據(jù)并進行數(shù)據(jù)可視化,爬取拉勾網(wǎng)關(guān)于python職位相關(guān)的數(shù)據(jù)信息,并將爬取的數(shù)據(jù)已csv各式存入文件,然后對csv文件相關(guān)字段的數(shù)據(jù)進行清洗,并對數(shù)據(jù)可視化展示,包括柱狀圖展示、直方圖展示,需要的朋友可以參考下
    2019-07-07
  • 使用PyTorch常見4個錯誤解決示例詳解

    使用PyTorch常見4個錯誤解決示例詳解

    這篇文章主要為大家介紹了使用PyTorch常見4個錯誤解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Python自動化辦公之創(chuàng)建PPT文件

    Python自動化辦公之創(chuàng)建PPT文件

    python-pptx模塊是Python中用于PPT操作的模塊。本文將利用這一模塊實現(xiàn)創(chuàng)建PPT文件。文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-05-05
  • selenium獲取元素定位的方法總結(jié)(動態(tài)獲取元素)

    selenium獲取元素定位的方法總結(jié)(動態(tài)獲取元素)

    要想操作一個元素,首先應(yīng)該識別這個元素,人有各種的特征(屬性),可以通過其特征找到人,同理,界面的某個元素會有各種的特征(屬性),可以通過這個屬性找到這對象,本文給大家介紹了python?selenium獲取元素定位的8種方法,需要的朋友可以參考下
    2024-02-02
  • python如何解決指定代碼段超時程序卡死

    python如何解決指定代碼段超時程序卡死

    這篇文章主要介紹了python如何解決指定代碼段超時程序卡死,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論

苍山县| 宜黄县| 甘洛县| 绥棱县| 台东市| 绥宁县| 哈密市| 庆安县| 许昌市| 施甸县| 榆社县| 金山区| 嘉定区| 苏尼特左旗| 当阳市| 临湘市| 平舆县| 贺州市| 武胜县| 确山县| 明溪县| 五寨县| 皮山县| 南部县| 松滋市| 如东县| 平陆县| 苍溪县| 双柏县| 武定县| 宜春市| 昌平区| 丹寨县| 封开县| 湘乡市| 台安县| 贵阳市| 盘山县| 楚雄市| 黎川县| 大足县|