python的攜程使用以及通訊

2021-10-05 21:51:38 字數 2570 閱讀 4918

python3.5以前

使用生成器(yield)來實現

def yield_test():

while true:

n = yield

print(n)

if __name__ == '__main__':

rest = yield_test()

next(rest)

rest.send('666')

把yield當做變數來接受數值

python3.5以後

使用async和await關鍵字實現

async關鍵字定義攜程函式

1.定義特殊的函式

async def async_f():

pass

2.當被呼叫時,不執行裡面的**,而是返回乙個攜程物件

3.在事件迴圈中排程其執行前,攜程物件不會執行任何的操作

await關鍵字

等待攜程執行完成

當遇到阻塞呼叫的函式的時候,使用await方法將攜程的控制權讓出,以便loop呼叫其他的攜程

asyncio模組

get_event_loop()獲得事件迴圈佇列

run_until_complete()註冊任務到佇列

在事件迴圈中排程其執行前,攜程物件不執行任何操作

asyncio模組用於事件迴圈

async def do_sth(x):

'''定義攜程函式 在前面加上async'''

print('等待中:'.format(x))

await asyncio.sleep(x)

# 判斷是否為攜程函式

print(asyncio.iscoroutinefunction(do_sth)) # 如果函式加了async 就返回true 否則flask

# 對函式進行呼叫拿到攜程物件

coroutine = do_sth(5)

# 事件迴圈佇列

loop = asyncio.get_event_loop()

# 註冊任務,把攜程任務新增到事件迴圈佇列

task = loop.create_task(coroutine)

print(task)

# 等待攜程任務執行結束

loop.run_until_complete(task)

print(task)

攜程中的通訊

巢狀通訊

import asyncio

async def compute(x,y):

print('計算x + y=> +'.format(x,y))

await asyncio.sleep(1)

return x + y

async def get_sum(x,y):

rest = await compute(x,y)

print(' + = '.format(x,y,rest))

# 拿到事件迴圈

loop = asyncio.get_event_loop()

loop.run_until_complete(get_sum(1,2))

loop.close()

佇列通訊

# 攜程之間佇列的通訊

import asyncio

import random

async def add(store, name):

'''寫入資料的佇列

:param store: 佇列物件

:return:

'''for i in range(5):

# 往佇列中新增數字

num = ' - '.format(name, i)

await store.put(i)

await asyncio.sleep(random.randint(1,5))

print(' add one ... , size:'.format(num, i, store.qsize()))

async def reduce(store):

'''從佇列刪除資料

:param store:

:return:

'''for i in range(10):

rest = await store.get()

print(' reduce one.. , size:'.format(rest, store.qsize()))

if __name__ == '__main__':

store = asyncio.queue(maxsize=5)

a1 = add(store, 'a1')

a2 = add(store, 'a2')

r1 = reduce(store)

# 新增到事件佇列

loop = asyncio.get_event_loop()

loop.run_until_complete(asyncio.gather(a1,a2,r1))

loop.close()

CMFCColorButton的使用以及重繪

cmfccolorbutton是visual studio 2008 sp1版本以上提供的顏色採集器。系統環境 windows 7 程式設計環境 visual studio 2008 sp1 下面介紹下使用步驟 1.新建基於對話方塊的工程,名稱為mycolorbuttondemo 2.拖動乙個按鈕到...

HandlerThread的使用以及原理

官方的描述 handlerthread 是乙個包含 looper 的 thread,我們可以直接使用這個 looper 建立 handler。handlerthread 的使用場景 我們知道,handlerthread 所做的就是在新開的子執行緒中建立了 looper,那它的使用場景就是 threa...

resultMap的使用以及理解

一般我們在mybatis中使用查詢語句的時候,如果查詢到的結果不能使用resulttype反應出來的時候,可以採用resultmap標籤來解決資料查詢不到的困難問題。其中type指代的是我們需要對映到的類物件,id表示resultmap在select標籤中用的時候的id名稱 這是設定主鍵使用的,使用...