或者我们干脆记忆成:要用gevent , 需要将from gevent import monkey;monkey.patch_all()放到文件的开头
from gevent import monkey;monkey.patch_all()import geventimport timedef 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)gevent.joinall([g1,g2])print('主')我们可以用threading.current_thread().getName()来查看每个g1和g2 , 查看的结果为DummyThread-n , 即假线程
查看threading.current_thread().getName()
from gevent import monkey;monkey.patch_all()import threadingimport geventimport timedef eat():print(threading.current_thread().getName())print('eat food 1')time.sleep(2)print('eat food 2')def play():print(threading.current_thread().getName())print('play 1')time.sleep(1)print('play 2')g1=gevent.spawn(eat)g2=gevent.spawn(play)gevent.joinall([g1,g2])print('主')Gevent之同步与异步from gevent import spawn,joinall,monkey;monkey.patch_all()import timedef task(pid):"""Some non-deterministic task"""time.sleep(0.5)print('Task %s done' % pid)def synchronous():# 同步for i in range(10):task(i)def asynchronous(): # 异步g_l=[spawn(task,i) for i in range(10)]joinall(g_l)print('DONE')if __name__ == '__main__':print('Synchronous:')synchronous()print('Asynchronous:')asynchronous()#上面程序的重要部分是将task函数封装到Greenlet内部线程的gevent.spawn 。#初始化的greenlet列表存放在数组threads中 , 此数组被传给gevent.joinall 函数 , #后者阻塞当前流程 , 并执行所有给定的greenlet任务 。执行流程只会在 所有greenlet执行完后才会继续向下走 。Gevent之应用举例一协程应用:爬虫
from gevent import monkey;monkey.patch_all()import geventimport requestsimport timedef get_page(url):print('GET: %s' %url)response=requests.get(url)if response.status_code == 200:print('%d bytes received from %s' %(len(response.text),url))start_time=time.time()gevent.joinall([gevent.spawn(get_page,'https://www.python.org/'),gevent.spawn(get_page,'https://www.yahoo.com/'),gevent.spawn(get_page,'https://github.com/'),])stop_time=time.time()print('run time is %s' %(stop_time-start_time))Gevent之应用举例二通过gevent实现单线程下的socket并发
注意 :from gevent import monkey;monkey.patch_all()一定要放到导入socket模块之前 , 否则gevent无法识别socket的阻塞
server
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)client
from socket import *client=socket(AF_INET,SOCK_STREAM)client.connect(('127.0.0.1',8080))while True:msg=input('>>: ').strip()if not msg:continueclient.send(msg.encode('utf-8'))msg=client.recv(1024)print(msg.decode('utf-8'))【一篇文章搞懂Python协程】多线程并发多个客户端
from threading import Threadfrom socket import *import threadingdef client(server_ip,port):c=socket(AF_INET,SOCK_STREAM) #套接字对象一定要加到函数内 , 即局部名称空间内 , 放在函数外则被所有线程共享 , 则大家公用一个套接字对象 , 那么客户端端口永远一样了c.connect((server_ip,port))count=0while 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+=1if __name__ == '__main__':for i in range(500):t=Thread(target=client,args=('127.0.0.1',8080))t.start()
推荐阅读
- 电饭锅茶菇鸡汤的做法,茶树菇鸡汤的做法
- HTML 为啥称“超文本标记语言”?
- 东北石茶的功效与作用,青茶的功效与作用是什么
- 茶叶鲜为人知的妙用,普洱茶残茶妙用
- 粗粮茶粥的做法,红茶玫瑰粥的做法
- Kubernetes 网络模型来龙去脉
- 茶油茶香老鸭怎么做,八宝茶香鸭
- 儿童节的由来,茶艺茶礼鞠躬的由来
- 大益8582生茶,大益之恋大益之恋礼品茶
- 冻顶乌龙茶与烘焙制茶,冻顶乌龙茶价格
