协程

2021-01-27  本文已影响0人  追梦若苦希望暖之

1.yield实现多任务

import time

def task_1():
    while True:
        print("---1---")
        time.sleep(.5)
        yield
        
def task_2():
    while True:
        print("---2---")
        time.sleep(.5)
        yield
    
def main():
    t1 = task_1()
    t2 = task_2()
    while True:
        next(t1)
        next(t2)

main()
image.png

2.gevent实现多任务

import gevent


def task1():
    while True:
        print("1")
        gevent.sleep(.5)

def task2():
    while True:
        print("2")
        gevent.sleep(.5)

def task3():
    while True:
        print("3")
        gevent.sleep(.5)

g1 = gevent.spawn(task1)
g2 = gevent.spawn(task2)
g3 = gevent.spawn(task3)

g1.join()
g2.join()
g3.join()

image.png
import gevent


def task1():
    while True:
        print("1")
        # gevent.sleep(.5)

def task2():
    while True:
        print("2")
        # gevent.sleep(.5)

def task3():
    while True:
        print("3")
        # gevent.sleep(.5)

g1 = gevent.spawn(task1)
g2 = gevent.spawn(task2)
g3 = gevent.spawn(task3)

g1.join()
g2.join()
g3.join()

取消延时函数后、阻塞在task1死循环

协程的核心思想是分配线程的执行时间片


3.自动优化时间片

import gevent
from gevent import monkey
import time

monkey.patch_all()  #自动规划ask中的延时片轮转

def task1():
    while True:
        print("1")
        time.sleep(.5)

def task2():
    while True:
        print("2")
        time.sleep(.5)

def task3():
    while True:
        print("3")
        time.sleep(.5)
       
gevent.joinall(
    [
        gevent.spawn(task1),
        gevent.spawn(task2),
        gevent.spawn(task3)
    ]
) 

4.Python语言原生协程

import asyncio

async def nested():
    return 42

async def main():
    # Schedule nested() to run soon concurrently
    # with "main()".
    task = asyncio.create_task(nested())

    # "task" can now be used to cancel "nested()", or
    # can simply be awaited to wait until it is complete:
    await task

asyncio.run(main())
上一篇下一篇

猜你喜欢

热点阅读