モジュールgevent
安装
pip3 install gevent
Geventは、サードパーティのライブラリである、あなたは簡単にgeventによって同期または非同期並行プログラミングを実装することができ、メインモードはgeventで使用されているGreenlet、それはアクセスPythonのC拡張モジュールの軽量コルーチンの形です。すべての主要なオペレーティング・システム・プロセス内で実行されますが、彼らは共同でスケジュールされているGreenlet。
#用法
g1=gevent.spawn(func,1,,2,3,x=4,y=5)创建一个协程对象g1,spawn括号内第一个参数是函数名,如eat,后面可以有多个参数,可以是位置实参或关键字实参,都是传给函数eat的
g2=gevent.spawn(func2)
g1.join() #等待g1结束
g2.join() #等待g2结束
#或者上述两步合作一步:gevent.joinall([g1,g2])
g1.value#拿到func1的返回值
これは、自動的にタスクがIOを遮断遭遇切り替わります
import gevent
def eat(name):
print('%s eat 1' %name)
gevent.sleep(2)
print('%s eat 2' %name)
def play(name):
print('%s play 1' %name)
gevent.sleep(1)
print('%s play 2' %name)
g1=gevent.spawn(eat,'egon')
g2=gevent.spawn(play,name='egon')
g1.join()
g2.join()
#或者gevent.joinall([g1,g2])
print('主')
実施例上部gevent.sleep(2)は、認識可能な閉塞IO模擬geventあります
そしてtime.sleep(2)またはその他の障害物、GEVENTは直接、次の行を使用する必要性を認識していない、パッチ、識別することができます
monkey.patch_all前()は、時間、ソケットモジュールとして、パッチを適用し、それらの前に置かれなければならない。geventインポートサルから
それとも単に覚えている:geventを使用し、あなたがgevent輸入サルからする必要があります。ファイルに()monkey.patch_allを開始します
from gevent import monkey;monkey.patch_all()
import gevent
import time
def eat():
print('eat food 1')
time.sleep(2)
print('eat food 2')
def play():
print('play 1')
time.sleep(1)
print('play 2')
g1=gevent.spawn(eat)
g2=gevent.spawn(play_phone)
gevent.joinall([g1,g2])
print('主')
我々はそれぞれG1とG2を表示する()。関連項目GetName()をthreading.current_thread使用することができ、ビューはDummyThread-Nの結果、それが偽であるスレッド
二つの練習
同時シングルスレッドソケットによって達成Gevent(gevent輸入サルから、インポートはソケットモジュールmonkey.patch_all()の前に配置する必要があり、そうでなければソケットブロッキングgevent認識されていません)
サーバー
from gevent import monkey;monkey.patch_all()
from socket import *
import gevent
#如果不想用money.patch_all()打补丁,可以用gevent自带的socket
# from gevent import socket
# s=socket.socket()
def server(server_ip,port):
s=socket(AF_INET,SOCK_STREAM)
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind((server_ip,port))
s.listen(5)
while True:
conn,addr=s.accept()
gevent.spawn(talk,conn,addr)
def talk(conn,addr):
try:
while True:
res=conn.recv(1024)
print('client %s:%s msg: %s' %(addr[0],addr[1],res))
conn.send(res.upper())
except Exception as e:
print(e)
finally:
conn.close()
if __name__ == '__main__':
server('127.0.0.1',8080)
マルチスレッド複数のクライアント
from threading import Thread
from socket import *
import threading
def client(server_ip,port):
c=socket(AF_INET,SOCK_STREAM) #套接字对象一定要加到函数内,即局部名称空间内,放在函数外则被所有线程共享,则大家公用一个套接字对象,那么客户端端口永远一样了
c.connect((server_ip,port))
count=0
while True:
c.send(('%s say hello %s' %(threading.current_thread().getName(),count)).encode('utf-8'))
msg=c.recv(1024)
print(msg.decode('utf-8'))
count+=1
if __name__ == '__main__':
for i in range(500):
t=Thread(target=client,args=('127.0.0.1',8080))
t.start()