多协程实例讲解(python 三)
還是講解下這個官網上的代碼吧
代碼在這:(講解在下面)
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))輸出的結果是:
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
從輸出的來看,雖然一開始是亂序的(可能是我解釋器的原因在這顯示的按照那個順序進行。)
- 總之,setter在后來gevent.sleep(3)的時候就實現了將控制權交給其他的協程。而其他所有的協程都是等待協程(等待進行evt.wait())
- 所以,在evt沒有進行到set()函數之前都是要一直這么等待下去的。
下面我做下改變。
改寫那個setter函數
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()沒有交換權限,只是設置了某一個類似啟動按鈕一樣的東西一樣~ 真正交換權限任然只有sleep()
總結
以上是生活随笔為你收集整理的多协程实例讲解(python 三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多协程实例分析(一)
- 下一篇: websocket python爬虫_p