协程

# def consumer():
# while True:
# x=yield
# print('***',x)
#
# c = consumer()
# next(c) #执行代码到yield停止
# c.send(1) #发送1给生成器,执行x=1,然后print x的值
#------------------------------------------------------------------------------
# def consumer():
# while True:
# x=yield
# print('处理了数据:',x)
#
# def producer():
# c=consumer()
# next(c)
# for i in range(10):
# print('生产了数据:',i)
# c.send(i)
#
# producer() #在一个程序内部调用另一个程序
#----------------------------------------------------------------------
#真正的协程模块就是使用greenlet完成的切换

from greenlet import greenlet
def eat():
print('eating start')
g2.switch() #切换到play去执行,不会自动返回
print('eating end')

def play():
print('playing start')

g1 = greenlet(eat)
g2 = greenlet(play)
g1.switch()
#-------------------------------------------------------------------------
import gevent
import time

def eat():
print('eating start')
#time.sleep(1) gevent感知不到time.sleep
gevent.sleep(1)
print('eating end')

def play():
print('playing start')
#time.sleep(1)
gevent.sleep(1)
print('playing end')

g1 = gevent.spawn(eat)
g2 = gevent.spawn(play)

g1.join()
g2.join()

#进程 线程之间的任务切换由操作系统完成
#协程任务之间的切换由程序完成。只有遇到协程模块认识的IO操作的时候,程序才会进行任务的切换,实现并发效果。
#-----------------------------------------------------------------------------------------------------
# import requests
# from urllib.request import urlopen
#
# url ='http://www.baidu.com'
# res1 = urlopen(url)
# res2 = requests.get(url)
#
# print(res1.read().decode('utf-8')) #有格式的
# print(res2.content.decode('utf-8')) #无格式的
#---------------------------------------------------------
# from gevent import monkey;monkey.patch_all()
# import gevent
# from urllib.request import urlopen
# def get_url(url):
# res = urlopen(url)
# content=res.read().decode('utf-8')
# return len(content)
#
# g1=gevent.spawn(get_url,'http://www.baidu.com')
# g2=gevent.spawn(get_url,'http://www.sogou.com')
# g3=gevent.spawn(get_url,'http://www.hao123.com')
# g4=gevent.spawn(get_url,'http://www.taobao.com')
# gevent.joinall([g1,g2,g3,g4])
# print(g1.value) #value 就是调用函数的返回值。
# print(g2.value)
# print(g3.value)
# print(g4.value)
#---------------------------------------------------------------
from gevent import monkey;monkey.patch_all()
import socket
import gevent

def talk(conn):
conn.send(b'hello')
print(conn.recv(1024).decode('utf-8'))
conn.close()

sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
while True:
conn,addr = sk.accept()
gevent.spawn(talk,conn)

sk.close()



原文地址:https://www.cnblogs.com/liu1983/p/13628127.html