python协程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python协程相关的知识,希望对你有一定的参考价值。

线程和进程的操作是由程序触发系统接口,最后的执行者是系统,协程的操作则是人为。

协程存在的意义:对于多线程应用,cpu通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程则只使用一个线程,在一个线程中规定某个代码块执行顺序。

协程的使用场景:当程序中存在大量不需要cpu的操作时(IO),适用于协程。

greenlet:需要提前安装(pip3 install greenlet,安装完greenlet后gevent也就安装上了)

技术分享
from greenlet import greenlet


def foo1():
    print(I am foo1-gl1)
    gl2.switch()
    print(Who am I?)
    gl2.switch()


def foo2():
    print(I am foo-gl2)
    gl1.switch()
    print(Who am I?.)


gl1 = greenlet(foo1)
gl2 = greenlet(foo2)
gl1.switch()
print(end)
greenlet
技术分享
import gevent, time


def foo():
    print(Running in foo)
    gevent.sleep(0)     #通过sleep去切换到另一个任务
    print(Explicit context switch to foo again.)


def bar():
    print(Explicit context switch to back to bar)
    gevent.sleep(1)
    print(我睡醒了)


def func():
    print(Explicit context switch to func.)
    gevent.sleep(0)
    print(I am come back)

gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(bar),
    gevent.spawn(func),
])
gevent

 

遇到IO操作自动切换:

# monkey.patch_all()为将原来socket修改为自己的socket去发送http请求
from gevent import monkey; monkey.patch_all()
import gevent, requests


def f(url):
    print(Get: ,url)
    resp = requests.get(url)
    data = resp.text
    with open(test, w, encoding=utf-8) as f:
        f.write(data)
    print(%d bytes recceved from %s % (len(data), url))

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

 

以上是关于python协程的主要内容,如果未能解决你的问题,请参考以下文章

Python中的协程与asyncio原理

Python中的协程与asyncio原理

Python中的协程与asyncio原理

python3之协程

python协程

python协程