1.手動協(xié)程操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# pip install gevent from greenlet import greenlet def test(): print ( 'He ' ) gr2.switch() # 切換到test2 print ( 'a ' ) gr2.switch() def test2(): print ( 'is ' ) gr1.switch() print ( 'student.' ) gr1 = greenlet(test) # 創(chuàng)建一個協(xié)程 gr2 = greenlet(test2) gr1.switch() # 切換到gr1,也就是運行它 |
2. 自動協(xié)程,遇到I/O自動切換
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import gevent from gevent import monkey; monkey.patch_all() # 導入monkey,給所有支持的模塊打上補丁,變成非阻塞模塊,也就是使其能夠進行協(xié)程操作 def test1(n): print ( "I'm doing my homework." ) gevent.sleep(n) # 模擬I/O操作,gevent自動切換 print ( 'Keep doing my homework.' ) def test2(n): print ( "I have no time to watch TV." ) gevent.sleep(n) print ( 'Stop thinking!' ) def test3(): print ( "Life is hard." ) # 等待 greenlets 全部結(jié)束 gevent.joinall([ gevent.spawn(test1, 3 ), # 創(chuàng)建一個新的greeenlet對象,并規(guī)劃它去執(zhí)行 test1(3) gevent.spawn(test2, 1 ), gevent.spawn(test3), ]) |
結(jié)果:
I'm doing my homework.
I have no time to watch TV.
Life is hard.
Stop thinking!
Keep doing my homework.
3. socket 協(xié)程實例:
服務(wù)器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import socket import gevent from gevent import monkey monkey.patch_all() # 打補丁,讓所有支持的模塊變成非阻塞的方法 def server(ip,port): s = socket.socket() # 生成socket對象 s.bind((ip, port)) # 綁定ip和端口 s.listen() # 設(shè)置監(jiān)聽 while True : cli, addr = s.accept() # 等待連接 gevent.spawn(handle_request, cli) # 對每一個連接,使用協(xié)程的方法生成greenlet def handle_request(conn): try : while True : data = conn.recv( 1024 ) # 接收數(shù)據(jù) print ( "recv:" , data) new = 'Hello ' + data.decode().title() conn.send(new.encode( 'utf8' )) # 返回數(shù)據(jù) if not data: conn.shutdown(socket.SHUT_WR) except Exception as e: print (e) finally : conn.close() if __name__ = = '__main__' : server( 'localhost' , 9999 ) |
客戶端:
1
2
3
4
5
6
7
8
9
10
|
import socket client = socket.socket() client.connect(( 'localhost' , 9999 )) while True : con = input ( '>>>:' ).strip() if len (con) = = 0 : continue client.send(con.encode( 'utf-8' )) data = client.recv( 1024 ) print (data.decode()) client.close() |
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://www.cnblogs.com/wztshine/p/12054120.html