协程

  • 协程多用在函数间切换,轻量级使用资源,生成器是实现协程的基本方式,这里首先看一下专门用作协程的模块greenlet。

    import greenlet
    
    def func1():
        print("eat starting")
        g2.switch()
        print("eat end")
        g2.switch()
    
    
    def func2():
        print("play starting")
        # g1.switch()
        print("play end")
    
    
    g1 = greenlet.greenlet(func1)
    g2 = greenlet.greenlet(func2)
    func1()
    
  • 这样调用switch方法,可以在函数中切换到另外一个函数中执行。

Gevent

  • 通常在开启协程时,使用gevent模块:
import gevent
import time

def func1():
    print("eat starting")
    gevent.sleep(1) # 使用gevent.sleep()可以感知到这个耗时动作
    print("eat end")


def func2():
    print("play starting")
    gevent.sleep(1)
    print("play end")


g1 = gevent.spawn(func1)
g2 = gevent.spawn(func2)
g1.join()
g2.join()
  • 在协程导入前加入from gevent import monkey;monkey.patch_all(),可以感知下面所有包的耗时操作,这样就可以自动开启协程了
from gevent import monkey;monkey.patch_all()
import gevent
import time

def func1():
    print("eat starting")
    time.sleep(1)  # 这里使用time操作就可以了
    print("eat end")


def func2():
    print("play starting")
    time.sleep(1)
    print("play end")


g1 = gevent.spawn(func1)
g2 = gevent.spawn(func2)
g1.join()
g2.join()
  • 进程和线程的任务切换由操作系统完成
  • 协程任务之间的切换由程序完成,只有遇到协程模块能识别的IO操作的时候,程序才会进行任务切换,实现并发的效果。
  • gevent.joinall() 可以开启一个可迭代对象中的所有协程。
from gevent import monkey;monkey.patch_all()
import gevent
import time

def func1():
    print("eat starting")
    time.sleep(1)  # 这里使用time操作就可以了
    print("eat end")
g_list = []
for i in range(10):
    g = gevent.spawn(func1)
    g_list.append(g)

gevent.joinall(g_list)

你可能感兴趣的:(协程)