python自動化の道-day 10


1.               
2.          
3.                   
4.      io           

greenlet   c       ,   python   yield,        
        ,             generator

# -*- coding:utf-8 -*-
from greenlet import greenlet
# import greenlet
import time

def test1():
    print("tes1   _1")
    g2.switch()
    time.sleep(3)
    print("tes1   _2")
    g2.switch()


def test2():
    print("test2   _1")
    g1.switch()
    # time.sleep(1)
    print("test2   _2")


if __name__ == '__main__':
    g1=greenlet(test1)   #  greenlet  ,       
    g2=greenlet(test2)
    g1.switch()   #      greenlet  
2.≪インスタンス|Instance|emdw≫
  :           ,
  :            ,               ,       ,
      ,   +   +   :  cpu            。            
  :        ,          ,        cpu     ,         
      cpu ,                       ,   cpu     。
      (blocking) (IO )        

#   yield       
import time
import queue
def consumer(name):
    print("--->starting eating baozi")
    while True:
        new_baozi = yield
        print("[%s] is eating [%s]"%(name,new_baozi))
def producer(name):
    print("--->starting making baozi")
    r1 =c1.__next__()
    r2 =c2.__next__()
    # print( c2.__next__())
    while True:
        print("[%s] is making baozi"%name)
        c1.send("baozi")
        c2.send("baozi")
        time.sleep(1)

if __name__ == '__main__':
    c1 = consumer("zhangsan_1")
    c2 = consumer("zhangsan_2")
    p = producer("lisi")

3.Gevent
"""
Gevent       ,      gevent           , gevent         
greenlet,   c        python      。greenlet            
     ,         。
 gevent  ,        yielding    .        ,
        ,    gevent.sleep(1),    yield   。
"""
import gevent

def func1():
    print("\033[31;1m func1_1 \033[0m")
    gevent.sleep(3)
    print("\033[31;1m func1_2 \033[0m")

def func2():
    print("\033[31;1m func2_1 \033[0m")
    gevent.sleep(1)
    print("\033[31;1m func2_2 \033[0m")

gevent.joinall(    #   wait,   
    [
        gevent.spawn(func1),
        gevent.spawn(func2)

    ]

)

4.        
 
  
#_*_ coding:utf-8 _*_

import gevent

def task(pid):
    gevent.sleep(1)
    print("task %s done"%pid)

def sync():
    for i in  range(1,10):
        task(i)
def async():
    threads = [gevent.spawn(task,i)for i in  range(10)]
    gevent.joinall(threads)

print("sync")
sync()

print("----------->")

print("async")
async()

"""
           task     Greenlet     gevent.spawn。    greenlet  
     threads ,      gevent.joinall   ,        ,
        greenlet。          greenlet           。
"""
5.IOブロック自動切替タスク
 
  
#_*_ coding:utf-8 _*_
from urllib.request import urlopen
from gevent import monkey
monkey.patch_all()
import gevent

def f(url):
    print("GET:%s"%url)
    resp =urlopen(url)
    data = resp.read()
    print("%d bytes received from %s"%(len(data),url))

gevent.joinall(
    [
        gevent.spawn(f,"http://www.xiaohuar.com/"),
        gevent.spawn(f,"https://www.yahoo.com/"),
        gevent.spawn(f,"https://github.com/")
    ]
)

"""
      
"""
gevent     :http://xlambda.com/gevent-tutorial/#_7