多协程实例讲解(python 三)
還是講解下這個(gè)官網(wǎng)上的代碼吧
代碼在這:(講解在下面)
import gevent from gevent.event import Event import time ''' Illustrates the use of events '''evt = Event()def setter():'''After 3 seconds, wake all threads waiting on the value of evt'''print('A: Hey wait for me, I have to do something')gevent.sleep(3)print("Ok, I'm done")evt.set()def waiter():'''After 3 seconds the get call will unblock'''print("I'll wait for you")evt.wait() # blockingprint("It's about time")def main():gevent.joinall([gevent.spawn(setter),gevent.spawn(waiter),gevent.spawn(waiter),gevent.spawn(waiter),gevent.spawn(waiter),gevent.spawn(waiter)])if __name__ == '__main__':starttime = time.time()main()endtime = time.time()print('Total use time is %.3f' % (endtime - starttime))輸出的結(jié)果是:
A: Hey wait for me, I have to do something
I’ll wait for you
I’ll wait for you
I’ll wait for you
I’ll wait for you
I’ll wait for you
Ok, I’m done
It’s about time
It’s about time
It’s about time
It’s about time
It’s about time
Total use time is 3.005
從輸出的來看,雖然一開始是亂序的(可能是我解釋器的原因在這顯示的按照那個(gè)順序進(jìn)行。)
- 總之,setter在后來gevent.sleep(3)的時(shí)候就實(shí)現(xiàn)了將控制權(quán)交給其他的協(xié)程。而其他所有的協(xié)程都是等待協(xié)程(等待進(jìn)行evt.wait())
- 所以,在evt沒有進(jìn)行到set()函數(shù)之前都是要一直這么等待下去的。
下面我做下改變。
改寫那個(gè)setter函數(shù)
A: Hey wait for me, I have to do something
I’ll wait for you
I’ll wait for you
I’ll wait for you
I’ll wait for you
I’ll wait for you
Ok, I’m done
After set.
It’s about time
It’s about time
It’s about time
It’s about time
It’s about time
After sleep
Total use time is 3.006
輸出變成了下面的這樣子。
- 通過After set 在It is about time前面,我們可以推斷出來。event.set()沒有交換權(quán)限,只是設(shè)置了某一個(gè)類似啟動(dòng)按鈕一樣的東西一樣~ 真正交換權(quán)限任然只有sleep()
總結(jié)
以上是生活随笔為你收集整理的多协程实例讲解(python 三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多协程实例分析(一)
- 下一篇: 多协程实例讲解(四 Python)