1. 程式人生 > >python 協程

python 協程

接口 news import pytho 生產者 () pre code producer

‘‘‘協成、對於非搶占式的調度程序 
1.與生成器 yleid()、保存狀態
2.用戶態的切換、切換由用戶決定
3.協程本身是一種微線程
4.協成也是面向IO操作
5.沒有切換的消耗
6.沒有鎖的概念
‘‘‘

(1)生成器函數

def f():
    print("ok")
    s= yield 5
    print(s)
    print("ok2")
    yield

gen=f()
x=gen.__next__()
print(x)
gen.send(0)

(2)生產者消費者模型用yeild實現

import queue
import time
q=queue.Queue()

def Cousumer(name):
    print(
"準備開始吃包子>>>>>>>>") while True: new_baozi = yield print("cousumer %s has eat %s baozi" %(name,new_baozi)) def Producer(name): r = con1.__next__() r = con2.__next__() n = 0 while 1: time.sleep(1) print("Producer %s is making baozi %s and %s
" %(name,n,n+1)) con1.send(n) con2.send(n+1) n +=2 if __name__ == __main__: con1 =Cousumer("c1") con2 = Cousumer("c2") p = Producer("1號廚師")

(3)-------------greenlet 函數間的切換更加方便--------------------------

#通過 switch() 隨時切換
from greenlet import greenlet
def too2():
    print(
898) gr1.switch() print(34) def too1(): print(89) gr2.switch() print("7897978") gr2.switch() gr1=greenlet(too1) gr2=greenlet(too2) # gr1.switch() # 動作的發起端 too1()

(4)-----------------gevent接口遇到IO等待操作實現自動切換---------------------

import requests,time,gevent
t1=time.time()
def f(url):
    print("GET: %s" % url)
    resp =requests.get(url)
    data=resp.text
    f= open("new.html","w",encoding="utf8")
    f.write(data)
    print("%d bytes recevied from %s" %(len(data),url))

gevent.joinall([
               gevent.spawn(f,"https://www.bilibili.com/video/av21663728/?p=325"),
               gevent.spawn(f,"http://news.baidu.com/"),
               gevent.spawn(f,"http://www.okoook.com/"),
               gevent.spawn(f,"https://www.imooc.com/"),
               gevent.spawn(f,"http://www.xiaohuar.com/"),
               gevent.spawn(f,"http://www.xiaohuar.com/hua/"),
              ])
# print(time.time()-t1)

#比較串行
# f("https://www.bilibili.com/video/av21663728/?p=325")
# f("http://news.baidu.com/")
#f("http://www.okoook.com/")
# f("https://www.imooc.com/")
# f("http://www.xiaohuar.com/")
# f("http://www.xiaohuar.com/hua/")

print(time.time()-t1)

python 協程