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名稱 這是設定主鍵使用的,使用...