多任务--协程

协程

使用yeild实现协程

  • 使用yeild冻结代码以及next唤醒代码方式实现
  • 协程一定是并发的
  • 协程可以节约资源

代码示例

import time

def work1():
    while True:
        print('正在扫地---')
        yield


def work2():
    while True:
        print('正在搬砖---')
        yield


w1 = work1()
w2 = work2()

# 协程肯定是并发执行
while True:
    next(w1)
    next(w2)

使用greenlet 创建协程

greenlet第三方模块,手动的切换任务

greenlet().switch() 切换任务

代码示例

import time
from greenlet import  greenlet


def test1():
    while True:
        print("---A--")
        gr2.switch()
        time.sleep(0.5)

def test2():
    while True:
        print("---B--")
        gr1.switch()
        time.sleep(0.5)

gr1 = greenlet(test1)
gr2 = greenlet(test2)

#切换到gr1中运行
gr1.switch()

使用gevent创建协程

  • 当遇到耗时任务的时候,比如文件,网络操作的时候,会自动切换到其他的greenlet
  • 使用gevent创建协程程序中的主线程是不会等待gevent任务结束而结束的,所以需要增加join操作,让主线程等待gevnet任务执行完毕
  • gevent的耗时操作,必须是gevent自己的功能才能识别,使用gevent下的耗时操作,比如gevent.sleep()等
  • 如果继续使用之前的耗时操作,那么在程序开头处需要增加下面两个内容:

    from gevent import monkey  # 找来猴子
    monkey.patch_all()  # 使用猴子来打补丁,打补丁之后所有的耗时操作都会被替换为 gevent 的调用
    

gevent基本使用

代码示例

import gevent
import time


def func1():
    while True:
        print('func1-----')
        gevent.sleep(1)  # gevent 的耗时操作,必须是 gevent自己的功能才能识别

def func2():
    while True:
        print('func2----')
        gevent.sleep(1)


g1 = gevent.spawn(func1)
g2 = gevent.spawn(func2)

# 主线程不会等待 gevent 任务结束
g1.join()
g2.join()

gevent高级使用

代码示例

import gevent
import time

from gevent import monkey  # 找来猴子
monkey.patch_all()  # 使用猴子来打补丁,打补丁之后所有的耗时操作都会被替换为 gevent 的调用

def func1():
    while True:
        print('func1-----')
        time.sleep(1)

def func2():
    while True:
        print('func2----')
        time.sleep(1)


g1 = gevent.spawn(func1)
g2 = gevent.spawn(func2)

# 主线程不会等待 gevent 任务结束
g1.join()
g2.join()

猜你喜欢

转载自blog.csdn.net/weixin_40420525/article/details/80884716