13.并发编程之协程(代码片段)

journeyer-xsh journeyer-xsh     2022-12-08     628

关键词:

一、协程基础

cpython下多个线程不能利用多核:规避了所有的io操作的单线程。

协程

  • 操作系统不可见
  • 协程本质就是一条线程,多个任务在一条线程上来回切换,来规避io操作,降低了线程上的io操作降到最低。

4 cpu:可以接受5个进程,20个线程,协程500

切换并规避IO的模块

  • gevent 利用 greenlet 底层模块完成的切换 + 自动规避IO的功能。
  • asyncio 利用 yield 底层语法完成的切换 + 自动规避IO的功能。
    • tornado 异步的web框架
    • yield from 更好的实现协程
    • send 更好的实现协程
    • asyncio模块,基于python原生的协程的概念正式被成立
    • 特殊的在python中提供协程的功能的关键字,aysnc await

进程、线程、协程之间区别:

进程 数据隔离 数据不安全 操作系统级别 开销最大 能利用多核
线程 数据共享 数据不安全 操作系统级别 开销较小 不能利用多核 一些和文件操作相关的io只有操作系统能感知到
协程 数据共享 数据安全 用户级别 开销非常小 不能利用多核 协程的所有切换都基于用户只有在用户级别能感知到的操作才会用协程模块做切换

用户级别的协程有什么好处?减轻操作系统的负担,一条线程开了多个协程,那么给操作系统的印象是线程很忙,这样能多争取一些时间来被cpu执行,程序的效率提高了。

二、gevent模块

协程之间是并发的,使用time.sleep()就不是并发的了。

import gevent

def func():     # 带有io操作的内容卸载函数中,然后提交func给gevent
    print(‘start func‘)
    gevent.sleep(1)
    print(‘end func‘)

g1 = gevent.spawn(func)
g2 = gevent.spawn(func)
g3 = gevent.spawn(func)
gevent.joinall([g1, g2, g3])

# g1.join()       # 阻塞,知道协程g1任务执行结束
# g2.join() 
# g3.join() 

from gevnet import monkey必须写在前面,不然time.sleep()就是同步的了。

from gevent import monkey
monkey.patch_all()
import gevent
import time

def func():     # 带有io操作的内容卸载函数中,然后提交func给gevent
    print(‘start func‘)
    time.sleep(1)
    print(‘end func‘)

g1 = gevent.spawn(func)
g2 = gevent.spawn(func)
g3 = gevent.spawn(func)
gevent.joinall([g1, g2, g3])

检测一个模块在gevent处能不能规避io?

import socket
print(socket.socket)			  # 在patch_all 之前打印一次
from gevent import monkey		# gevent 如何检测是否能规避某个模块的io操作?
monkey.patch_all()
import socket
import gevent
print(socket.socket)				# 在path_all 之后打印一次,如果两次不一样,那么就说明能规避io操作

三、asyncio模块

import asyncio
async def func(name):
    print(‘start‘, name)
    # await 可能会发生阻塞的方法
    # await 关键字必须卸载一个asyncio函数中
    await asyncio.sleep(1)
    print(‘end‘)
loop = asyncio.get_event_loop()
# 同步
# loop.run_until_complete(func(‘an‘))
# 异步
loop.run_until_complete(asyncio.wait([func(‘an‘), func(‘bn‘)]))

并发编程之协程(代码片段)

一、协程的介绍协程:是单线程下的并发,一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。对比操作系统控制线程的切换,用户在单线程内控制协程的切换优点:#1.协程的切换开... 查看详情

并发编程之协程(代码片段)

... 随着我们对于效率的追求不断提高,基于单线程来实现并发 查看详情

并发编程之协程(代码片段)

引言 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态cpu正在运行一个任务,会在两种情况下切走去执行其他的任... 查看详情

并发编程之协程(代码片段)

一,引子本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态cpu正在运行一个任务,会在两种情况下切走去执行其他的任... 查看详情

网络编程进阶:并发编程之协程io模型(代码片段)

协程:基于单线程实现并发,即只用一个主线程(此时可利用的CPU只有一个)情况下实现并发;并发的本质:切换+保存状态CPU正在运行一个任务,会在两种情况下切走去执行其他任务(切换有操作系统强制控制),一种情况是... 查看详情

编程之协程(代码片段)

引子本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态  cpu正在运行一个任务,会在两种情况下切走去执行其他... 查看详情

go并发编程之协程及其调度机制

协程(coroutine)是Go语言最大的特色之一,goroutine的实现其实是通过协程。协程的概念协程一词最早出现在1963年发表的论文中,该论文的作者为美国计算机科学家MelvinE.Conway。著名的康威定律:“设计系统的架构受制于产生这些... 查看详情

并发编程之协程

  对于单线程下,我们不可避免程序中出现io操作,但如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另外一个任务去计算,这样就保证了该线... 查看详情

13并发编程-(协程)-协程的基本概念(代码片段)

1、协程--引子本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态cpu正在运行一个任务,会在两种情况下切走去执行其他... 查看详情

并发之协程(代码片段)

...统完全感知不到,因而更加轻量级#2.单线程内就可以实现并发的效果,最大限度地利用cpu缺点如下:#1.协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程#2.协... 查看详情

并发编程路线

一python并发编程之多进程理论二python并发编程之多进程实现三python并发编程之多线程理论四python并发编程之多线程实现五python并发编程之协程理论六python并发编程之协程实现七python并发编程之IO模型五补充:paramiko模块 查看详情

day1818.1并发爬虫之协程实现(代码片段)

并发爬虫之协程实现协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的... 查看详情

amphp之协程(代码片段)

目录Amphp之协程Yield特性(YieldBehavior)Yieldvs.YieldFromAmphp之协程协程是可中断的函数。在PHP中,它们可以使用生成器来实现。虽然生成器通常用于使用yield关键字实现简单的迭代器和产生元素,但Amp使用yield作为中断... 查看详情

amphp之协程(代码片段)

目录Amphp之协程Yield特性(YieldBehavior)Yieldvs.YieldFromAmphp之协程协程是可中断的函数。在PHP中,它们可以使用生成器来实现。虽然生成器通常用于使用yield关键字实现简单的迭代器和产生元素,但Amp使用yield作为中断... 查看详情

并发之协程

...回到顶部一引子  本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态  cpu正在运行一个任务,会在两种情... 查看详情

java之协程(quasar)(代码片段)

...理。这里补充Java的协程实现过程。有需要可以查看python之协程。  二、Java协程,其实做Java这么久我也没有怎么听过Java协程的东西,但是一直有有听到微线程/协程的概念,这不在学习Python的时候接触到了协程一词。然后返回... 查看详情

python之协程(代码片段)

   一、这几天在折腾Python的协程问题,Python的协程相对原理上来说要简单很多了。在使用Java做开发的时候,经常使用线程,过程中经常也有听说过微线程/协程的概念,但是没有去深刻的学习过Java的协程是怎么实现的。这... 查看详情

amphp之协程助手(代码片段)

目录Amp协程助手coroutine()asyncCoroutine()call()asyncCall()Amp协程助手Amp\\Coroutine需要将一个已经实例化的生成器传递给它的构造函数。在将生成器传递给Amp\\Coroutine之前始终调用可调用对象是不必要的样板文件。coroutine()返回一个新函数&... 查看详情