Python3.4之后引入协程解决多线程问题的原理及特点

python多线程总是受到批评。尽管I/O密集型操作具有良好的效率,可以使用多线程效率,但过多的线程会导致频繁的CPU切换线程,以供高高和网站中涉及的头发问题。当时,CPU性能的损失不可忽视。为了解决多线程带来的问题,Python3.4引入了Coroutine。

Python3.4之后引入协程解决多线程问题的原理及特点

该线程是CPU执行的最小单元,而Coroutine是一个比线程小的执行单元,因为它带有CPU上下文。与线程相比,Coroutine只是CPU的上下文,它不会看起来CPU的性能损失,而Coroutine的上下文切换速度非常快,可以达到每秒一百万级切换。

但是Coroutine的切换不是自动的,我们需要手动指定其切换的时机。

Python中Coroutine的实现需要使用产量,产量实际上将功能变成了生成器

def func():
    print("abc")
    a = yield 1 # yield将函数变成生成器
    print("def")
print(func()) # 

我们可以通过NEXT()方法按顺序将生成器的内容进行订单,直到报告到Startration错误

def func():
    print("abc")
    a = yield 1
    print("def")
g = func()
while True:
    print(next(g))

因此,我们如何使用产量来实施Coroutine。看一个案子。

def func1():
    while True:
        print("----A----") # (第三步) (第九步)
        a = yield 1 # 遇到yield停止,切换到func2,并携带a = 1 (第四步) (第十步)
        print(a) # a = 2 (第七步)
        print("----B----") # (第八步)
def func2(g):
    print("----C----") # (第一步)
    a =next(g) # 切换到func1(第二步)
    print(a) # a = 1 (第五步)
    g.send(2) # send()切换到func1,并将2赋值给yield左边的变量 (第六步)
    print(a) # (第十一步)
    print("----D----") # (第十二步)
g = func1()
func2(g)

从上面的情况下,我们可以看到Coroutine中上下文的切换实际上是由Next()和Send()方法实现的。

Python通过产量获得了对Coroutine的基本支持,但尚未完成。第三方图书馆Gevent意识到了对Coroutine的相对完整的支持。

GEVENT基于Greenlet的第三方公司图书馆。 Greenlet是Python原始产量的包装。您可以将开关用于Coroutial Switch,但是您仍然需要手动切换。 GEVENT是根据Greenlet包装的,Greenlet可以在遇到I/O操作时自动切换。

GEVENT中的Monkey_patch可以将Python标准库中的大多数阻塞性调用转变为非块类型。通过monkey.patch_all(),源代码

通过使用Monkey补丁,我们可以将PTHON标准库中的许多阻塞性调用转换为非块类型。

如果我们只想使用时间非块,我们可以使用monkey.patch_all()或monkey.patch_time()

通过一个例子了解吉文特

import gevent
from gevent import monkey
import time
monkey.patch_time() # 猴子补丁,也可以写成monkey.patch_all()
def func(arg):
    print("%s:%s,%s"%(time.strftime("%H:%M:%S",time.localtime()),gevent.getcurrent(),arg))
    time.sleep(1) # 模仿I/O操作
    print("%s:%s,%s"%(time.strftime("%H:%M:%S",time.localtime()),gevent.getcurrent(),arg))
start_time = time.time()
gevent.joinall([
    gevent.spawn(func,"----A----"), # 启动协程
    gevent.spawn(func,"----B----"),
    gevent.spawn(func,"----C----"),
])
end_time = time.time()
print("耗时:%s"%(end_time-start_time))

您可以看到三个冠端是同时启动并同时执行的。

GEVENT基于I/O切换Coroutines,这可以大大提高程序执行的能力。在网站的撰写中,我们不需要考虑使用Gevent。您只需要配置在网站部署过程中支持GEVENT的WSGI服务器即可。并行获取一个很棒的网站。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

26阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读