首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏数据云团

    并发篇-python-2

    遇到阻塞就切换到另一个继续执行 ! gevent 通信 ? # 将函数封装成,并开始调度 >>>producer = gevent.spawn(producer, queue) # 阻塞(一阻塞就切换)等待 >>>gevent.joinall([producer gevent通信 问题引入 问题一: 程之间不是能通过switch通信嘛? >>>是的,由于 gevent 基于 greenlet,所以可以。 问题二: 那为什么还要考虑通信问题? gevent是python的一个并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效。

    44220发布于 2019-07-18
  • 来自专栏python3

    python

    python入门 函数的执行顺序 在了解程之前, 我们需要再次回想一下python中的多个函数执行的顺序是怎样的? 一个简单的 如何调用 #! /usr/bin/python #-*-coding:utf-8-*- def A1(): print(1) yield 10 print(2) yield 20 if /usr/bin/python #-*-coding:utf-8-*- '''实现生产者与消费者模型''' def product(c): '''生产者:厨师生产包子 - 生产者接收消费者发来的消息 : yield关键字 实际上是 : 生成器函数 使用g.send(None)触发 g.send("a") 像xie内部发送数据 g.close()关闭

    79110发布于 2020-01-21
  • 来自专栏Devops专栏

    Python

    仅供学习,转载请注明出处 ,又称微线程,纤。英文名Coroutine。 是啥 python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。 这样只要在合适的时机, 我们可以把一个 切换到另一个。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。 --- greenlet 为了更好使用来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单 安装方式 使用如下命令安装greenlet模块: pip install gevent greenlet已经实现了,但是这个还的人工切换,是不是觉得太麻烦了,不要捉急,python还有一个比greenlet更强大的并且能够自动切换任务的模块gevent 其原理是当一个

    1K30发布于 2019-05-31
  • 来自专栏python3

    python

    也是单线程的,没法利用cpu的多核,想利用cpu多核可以通过,进程+的方式,又或者进程+线程+。 1、的简单实现 的原理是通过生成器实现,如下:程序执行到19行,执行consumer函数到13行,next生成器,执行producer函数到8行停下,返回consumer函数13行继续往下执行, gevent是对gevent的再次封装,能自动识别耗时操作切换到其它。注意gevent遇到耗时操作才会切换运行,没有遇到耗时操作是不会主动切换的。 gevent.spawn(*args, **kwargs)    不定长参数中的第一个参数为执行的方法fn,其余的依次为 fn 的参数。开启了后要调用join方法。 打补丁 当开启的很多的时候,一个个的调用join方法就有点麻烦,所以gevent提供了一个方法joinall(),可以一次join所有的

    58520发布于 2020-01-19
  • 来自专栏zingpLiu

    Python中的

    1 1.1的概念 ,又称微线程,纤。英文名Coroutine。一句话说明什么是线程:是一种用户态的轻量级线程。 1.2 的优缺点 的优点:   (1)无需线程上下文切换的开销,避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,也失去了标准线程使用多CPU的能力) (2)进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序 2 Python中如何实现 2.1 yield实现   前文所述“子程序(函数)在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序 2.2 greenlet实现   Python的 greenlet就相当于手动切换,去执行别的子程序,在“别的子程序”中又主动切换回来。。。 greenlet例子: 1 #! 实现,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级

    1.7K20发布于 2018-09-05
  • 来自专栏python3

    Python:线程、进程与(2)—

        上一篇博文介绍了Python中线程、进程与的基本概念,通过这几天的学习总结,下面来讲讲Python的threading模块。首先来看看threading模块有哪些方法和类吧。 ? (二)Lock互斥锁     如果多个线程访问同时同一个资源,那么就有可能对这个资源的安全性造成破坏,还好Python的threading模块中引入了互斥锁对象,可以保证共享数据操作的完整性。 (四)条件变量Condition         除了互斥锁外,对复杂线程同步问题,Python提供了Condition对象来支持解决。 = threading.Thread(target=worker, args=(readis_ready,"t2"), name='t2') t2.start() print('first of all RLock、Condition、Semaphore和BoundedSemaphore对象里定义了__enter__()和__exit__()函数,而这两个真是上下文管理协议的必要条件(有兴趣可以参看之前博文 Python

    72210发布于 2020-01-07
  • 来自专栏Bennyhuo

    破解 Kotlin (2) - 启动篇

    2. 再来看看的启动 说了这么多线程,原因嘛,毕竟大家对它是最熟悉的。 我们说过,启动需要三样东西,分别是 上下文、启动模式、体,体 就好比 Thread.run 当中的代码,自不必说。 本文将为大家详细介绍 启动模式。 } job.cancel() log(3) 我们创建了后立即 cancel,但由于是 ATOMIC 模式,因此一定会被调度,因此 1、2、3 一定都会输出,只是 2 和 3 的顺序就难说了。 delay(1000) log(3) } job.cancel() log(4) job.join() 我们在 2 和 3 之间加了一个 delay, delay 会使得体的执行被挂起 2 会连续在同一线程中执行, delay 是挂起点,因此 3 会等 100ms 后再次调度,这时候 4 执行, join 要求等待执行完,因此等 3 输出后再执行 5。

    1.4K30发布于 2020-02-20
  • 来自专栏飞鸟的专栏

    十、python学习笔记--爬虫(对比和非效率)

    # 一个简单的小爬虫,将3个页面的数据保存到data.html,对比和非的使用时间 """ 1、通过urlopen获取数据 2、写入文件 3、使用三个页面,通过gevent.joinal执行 (会在IO阻塞处切换),用时短 4、在Windows系统,由于捕获IO较慢。 f.write(data) print('{} bytes received from {}'.format(len(data), url)) url_list = ['https://www.python.org , 'http://www.yahoo.com/'] start_time = time.time() gevent.joinall([gevent.spawn(foo, 'https://www.python.org

    1K31编辑于 2022-02-10
  • 来自专栏厉害了程序员

    python2:yield from 分析

    上一篇python1:yield的使用介绍了: 生成器作为使用时的行为和状态 使用装饰器预激 调用方如何使用生成器对象的 .throw(…) 和 .close() 方法控制 这一篇将介绍 : 终止时如何返回值 yield新句法的用途和语义 让返回值 先看一个例子: 这段代码会返回最终均值的结果,每次激活时不会产出移动平均值,而是最后一次返回。 yield from 的主要功能是打开双向通道,把最外层的调用方与最内层的子生成器连接起来,使两者可以直接发送和产出值,还可以直接传入异常,而不用在中间的添加异常处理的代码。 然后把数据传给之前定义的 averager ,最后生成一个报告。 下一篇,会分析一个使用的经典案例: 仿真编程。这个案例说明了如何使用在单线程中管理并发活动。

    1.1K10发布于 2020-12-25
  • 来自专栏sktj

    python

    image.png image.png .send .close image.png yield from?

    65520发布于 2019-09-25
  • 来自专栏若尘的技术专栏

    Python

    参考资料 http://python.jobbole.com/86481/ http://python.jobbole.com/87310/ http://segmentfault.com/a/1190000009781688 3 5 8 13 21 34 55 历史历程 3.4引入,用yield实现 3.5引入语法 实现的比较好的包有asyncio,tornado,gevent 定义: 是为非抢占式多任务产生子程序的计算机程序组件 ,允许不同入口点在不用位置暂停或者执行程序。 从技术角度讲,就是一个你可以暂停执行的函数,或者干脆把理解成生成器 的实现: yield返回 send调用 的四个状态 inspect.getgeneratorstate(...) 终止 中未处理的异常会向上冒泡,传给 next 函数或 send 方法的调用方(即触发的对象) 终止的一种方式:发送某个哨符值,让退出。

    1.9K127发布于 2021-05-11
  • 来自专栏CS实验室

    Python

    Python (Coroutine)又称微线程,即轻量级的线程。可以理解成与调用方协作,产出由调用方提供的值的过程。与线程相比,其优势在于上下文切换的成本更低,且由用户自己控制。 发展史 Python 中的主要经历了三个阶段。 async / await 从 python3.5 开始,Python 新加了一种定义方法 asyncdef。 简单的讲,async 定义一个,await 用于挂起阻塞的异步调用接口;而的调用方法在 Python3.7 中做了些许改动,所以这一节以 Python 版本分成两部分来讲解。 python 3.5 - 3.6 阅读的官方文档就会知道:本身无法运行,只有将其置于事件循环(event_loop)中才能运行其代码。那么事件循环是什么?

    87520发布于 2021-03-22
  • 来自专栏开源部署

    Python

    这是通过栈实现的,一个函数就是一个执行的子程序,子程序的调用总是有一个入口、一次返回,调用的顺序是明确的 又称微线程(纤),是一种用户态的轻量级线程 理解 普通理解:线程是系统级别的,它们是由操作系统调度 是程序级别,由程序员根据需求自己调度。我们把一个线程中的一个个函数称为子程序,那么一个子程序在执行的过程中可以中断去执行别的子程序,这就是。 也就是说同一个线程下的一段代码1执行执行着就中断,然后去执行另一段代码2,当再次回来执行代码1时,接着从之前的中断的位置继续向下执行 专业理解:拥有自己的寄存器上下文和栈,在调度切换时,将寄存器上下文和栈保存到其他的地方 因此,能后保留一次调用的状态,每次过程重入时,就相当于进入上一次调用的状态 优点 a、无需线程上下文切换的开销,避免了无意义的调度,从而提高了性能,但是程序员必须自己承担调度的任务,同时也失去了标准线程使用多 ) 结果 正常结果 1 2 3 4 a b c d 实现的结果(假设) 1 a b <span class="hljs-number

    43540编辑于 2022-09-08
  • 来自专栏Michael阿明学习之路

    python

    工作流程和状态 2. 预激的装饰器 3. 终止、异常处理 4. 让返回值 5. yield from learn from 《流畅的python》 1. 工作流程和状态 def simple_coroutine(): # 使用生成器函数定义,有yield关键字 print("-> coroutine started") x = yield /fluent_python/coroutine.py", line 12, in <module> # my_coro.send(24) # StopIteration 可以查看的状态 print 终止、异常处理 中未处理的异常会向上冒泡,传给 next 函数或 send 方法的调用方(即触发的对象)。 还可以用做 离散事件仿真 如果想使用现成的 Python 库,可以使用 SimPy

    71330编辑于 2022-11-26
  • 来自专栏程序员

    Python

    Python 创建函数 Python3.5引入了关键字async来定义函数 async def fun(): """函数""" print(1) 函数和普通的函数不一样 必须将对象(函数)放入事件循环中来执行。在Python3.4的时候,引入内置模块asyncio,该模块可以将对象加入到事件循环中执行。 # 将对象放入任务列表 # Python3.7之后,可以使用下面的方式运行函数。 asyncio.run(xc) await await也是Python3.5引入的新关键字。await的作用就是等待可等待对象。 可等待对象包含对象,future对象,task对象。 3 4 5 6 7 8 9 end 我们可以观察到,首先输出start,说明func1被执行,然后遇到await,转去执行函数func2,func2中有一个等待。

    1.1K10编辑于 2022-05-05
  • 来自专栏ZackSock

    Python

    是啥 python 中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。为啥说它是一个执行单元,因为它自带 CPU 上下文。 这样只要在合适的时机, 我们可以把一个 切换到另一个。只要这个过程中保存或恢复 CPU 上下文那么程序还是可以运行的。 但是 的切换只是单纯的操作 CPU 的上下文,所以一秒钟切换个上百万次系统都抗的住。 greenlet模块 为了更好使用来完成多任务,python 中的 greenlet 模块对其封装,从而使得切换任务变的更加简单 使用如下命令安装 greenlet 模块: pip install gevent模块 greenlet 已经实现了,但是这个还的人工切换,是不是觉得太麻烦了,不要着急,python还有一个比greenlet更强大的并且能够 自动切换任务 的模块 gevent 其原理是当一个

    56920发布于 2021-04-13
  • 来自专栏毛利学Python

    python

    是实现并发编程的一种方式。 https://docs.python.org/zh-cn/3/library/asyncio.html 一说并发,你肯定想到了多线程 / 多进程模型,没错,多线程 / 多进程,正是解决并发问题的经典模型之一 :是单线程下的并发,又称微线程。 比线程的单位更小—— 注意这个概念完全是程序员自己想出来的东西,它对于操作系统来说根本不存在。操作系统只知道进程和线程。 (main()) 的写法简洁清晰,把 async / await 语法和 create_task 结合来用。

    68520发布于 2019-11-10
  • 来自专栏hui

    Python

    是啥 python 中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带 CPU 上下文。 这样只要在合适的时机, 我们可以把一个 切换到另一个。 只要这个过程中保存或恢复 CPU 上下文那么程序还是可以运行的。 但是 的切换只是单纯的操作 CPU 的上下文,所以一秒钟切换个上百万次系统都抗的住。 greenlet模块 为了更好使用来完成多任务,python 中的 greenlet 模块对其封装,从而使得切换任务变的更加简单 使用如下命令安装 greenlet 模块: pip install gevent模块 greenlet 已经实现了,但是这个还的人工切换,是不是觉得太麻烦了,不要着急,python还有一个比greenlet更强大的并且能够 自动切换任务 的模块 gevent 其原理是当一个

    77000发布于 2021-04-04
  • 来自专栏乱码李

    Python

    可能出现的结果是: 1 2 x y 3 z 看起来好像两个函数同时执行了。但是一定要注意,这里只有一个线程。 无私函数之间相互协作完成任务,所以称为“”。 所以在执行过程中可以中断该子程序,去执行其他子程序。 与子程序 与子程序的根本区别是 执行时期控制权能否转接。 send 从上面的程序中可以看到,目前只有数据从 fib() 中通过 yield 流向外面的 for 循环;如果可以向 fib() 发送数据,那不是就可以在 Python 中实现了嘛。 grep Python 实现的 grep 也是一个很好的的例子 def grep(pattern): print("Searching for", pattern) while True Python3.5 引入 async/await 让表面上独立于生成器而存在,让 Python更加方便。 学习完成后会更新博客,敬请期待。

    51610发布于 2021-11-26
  • 来自专栏python3

    python与golang的区

    和线程的关系 是在语言层面实现对线程的调度,避免了内核级别的上下文消耗。 python与调度 Python源于yield指令。 和大多数语言一样,在 Python 中,的调度是非抢占式的,也就是说一个必须主动让出执行机会,其他才有机会运行。 让出执行的关键字就是 await。 ,挂起,等待服务端处理完成返回后再调用CallBack函数继续下面的流程 Go的 Go天生在语言层面支持,和Python类似都是采用了关键字,而Go语言使用了go这个关键字,可能是想表明是Go语言中最重要的特性 ---- 某书 的4种状态 Pending Running Done Cacelled 和系统线程之间的映射关系 go的本质上还是系统的线程调用,而Python中的是eventloop模型实现 Python 中的是严格的 1:N 关系,也就是一个线程对应了多个协。虽然可以实现异步I/O,但是不能有效利用多核(GIL)。

    1.8K20发布于 2020-01-06
领券