網(wǎng)站首頁 編程語言 正文
使用 asyncio 包處理并發(fā)
asyncio包:使用事件循環(huán)驅(qū)動(dòng)的協(xié)程實(shí)現(xiàn)并發(fā)。
線程與協(xié)程的對(duì)比
'\ thinking' 旋轉(zhuǎn)等待效果
In [1]: import threading In [2]: import itertools In [3]: import time,sys In [4]: class Signal: # 定義一個(gè)簡單的可變對(duì)象;go 屬性 從外部控制線程 ...: go = True In [5]: def spin(msg,signal): ...: w,flush = sys.stdout.write,sys.stdout.flush ...: for char in itertools.cycle('|/-\\'): # 從序列中反復(fù)不斷的生成元素 ...: status = char + ' ' + msg ...: w(status) ...: flush() ...: w('\x08' * len(status)) # 退格鍵:\x08 文本動(dòng)畫的訣竅所在 ...: time.sleep(1) ...: if not signal.go: ...: break ...: w(' ' * len(status) + '\x08' * len(status)) In [6]: def slow(): ...: time.sleep(3) ...: return 42 In [9]: def super(): ...: signal = Signal() ...: sp = threading.Thread(target=spin,args=('thinking',signal)) ...: print('============') ...: sp.start() ...: res = slow() ...: signal.go = False ...: sp.join() ...: return res
注意:Python 沒有提供終止線程的 API ,這是有意為之的。若想關(guān)閉線程,必須給線程發(fā)送消息。這里用的是 signal.go 屬性。干凈的規(guī)則的退出。
適合 asyncio API 的協(xié)程:
1 定義體必須使用?yield from
?,而不能使用?yield
2 協(xié)程要由調(diào)用方驅(qū)動(dòng),并由調(diào)用方通過?yield from
?調(diào)用
3 或者把協(xié)程傳給 asyncio 包中的某個(gè)函數(shù),比如 asyncio.async()
4 @asyncio.coroutine 裝飾器應(yīng)該用在協(xié)程上
asyncio 實(shí)現(xiàn) 動(dòng)畫效果
In [1]: import asyncio In [3]: import itertools In [4]: import sys # 交給 asyncio 處理的協(xié)程需要使用該裝飾器裝飾。這不是強(qiáng)制要求,但是強(qiáng)烈建議這么做。 In [5]: @asyncio.coroutine ...: def spin(msg): # 不需要多線程的關(guān)閉參數(shù) ...: w,flush = sys.stdout.write, sys.stdout.flush ...: for char in itertools.cycle('|/-\\'): ...: status = char + ' ' + msg ...: w(status) ...: flush() ...: w('\x08' * len(status)) ...: try: ...: yield from asyncio.sleep(.1) # 不會(huì)阻塞事件循環(huán) # spin 函數(shù)蘇醒后,取消請(qǐng)求 異常,退出循環(huán) ...: except asyncio.CancelledError: ...: break ...: write(' ' * len(status) + '\x08' * len(status)) ...: In [6]: @asyncio.coroutine ...: def slow(): # 把控制權(quán)交給主循環(huán),休眠結(jié)束后,結(jié)束這個(gè)協(xié)程 ...: yield from asyncio.sleep(3) ...: return 42 ...: In [9]: @asyncio.coroutine ...: def sup(): # asyncio 排定spin協(xié)程的運(yùn)行時(shí)間,封裝成一個(gè) Task對(duì)象 sp ...: sp = asyncio.async(spin('thinking!')) ...: print('spin obj:',sp) # sup 也是協(xié)程,因此,可以使用 yield from 驅(qū)動(dòng) slow() ...: res = yield from slow() sp.cancel() ...: return res ...: In [10]: def main(): ...: loop = asyncio.get_event_loop() ...: res = loop.run_until_complete(sup()) ...: loop.close() ...: print('answer:',res) ...: In [11]: main() D:\python36\Scripts\ipython:3: DeprecationWarning: asyncio.async() function is deprecated, use ensure_future() spin obj: <Task pending coro=<spin() running at <ipython-input-5-0304845f34e1>:1>> answer: 42!
除非想阻塞主線程,從而凍結(jié)事件循環(huán)或整個(gè)應(yīng)用,否則不要在 asyncio 協(xié)程中使用 time.sleep() 。如果協(xié)程需要一段時(shí)間內(nèi)什么也不做,應(yīng)該使用 yield from asyncio.sleep() 。
@asyncio.coroutine 裝飾器不是強(qiáng)制要求,但是強(qiáng)烈建議這么做,因?yàn)檫@樣能
1 把協(xié)程凸顯出來,有助于調(diào)試。
2 如果還未產(chǎn)出值,協(xié)程就被垃圾回收了(意味著有操作未完成,因此有可能是個(gè)缺陷),那就可以發(fā)出警告了。
3 這個(gè)裝飾器不會(huì)預(yù)激協(xié)程。
原文鏈接:https://blog.csdn.net/m0_72557783/article/details/128188439
相關(guān)推薦
- 2022-06-29 一文教會(huì)你使用Nginx訪問日志統(tǒng)計(jì)PV與UV_nginx
- 2022-07-03 Go?的入口函數(shù)和包初始化的使用_Golang
- 2022-03-18 C#?利用Autofac批量接口注入依賴的問題小結(jié)_C#教程
- 2022-03-17 docker-compose安裝yml文件配置方式_docker
- 2022-07-31 C++超詳細(xì)講解引用和指針_C 語言
- 2022-02-02 element ui el-dialog 居中,并且內(nèi)容多的時(shí)候內(nèi)部可以滾動(dòng)
- 2022-06-06 微信小程序動(dòng)態(tài)綁定class
- 2023-07-07 @Autowired 注解有什么用?@Qualifier 注解有什么用? @RequestMappi
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支