zoukankan      html  css  js  c++  java
  • python 协程

    协程

    线程和进程的操作是由程序触发系统接口,最后的执行者是系统,它本质上是操作系统提供的功能。而协程的操作则是程序员指定的,在python中通过yield,人为的实现并发处理。
    协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时。协程,则只使用一个线程,分解一个线程成为多个“微线程”,在一个线程中规定某个代码块的执行顺序。
    协程的适用场景:当程序中存在大量不需要CPU的操作时(IO)。
    在不需要自己“造轮子”的年代,同样有第三方模块为我们提供了高效的协程,这里介绍一下greenlet和gevent。本质上,gevent是对greenlet的高级封装,因此一般用它就行,这是一个相当高效的模块。
    在使用它们之前,需要先安装,可以通过源码,也可以通过pip。

    greenlet

    from greenlet import greenlet
    
    def test1():
        print(12)
        gr2.switch()
        print(34)
        gr2.switch()
    
    def test2():
        print(56)
        gr1.switch()
        print(78)
    
    gr1 = greenlet(test1)
    gr2 = greenlet(test2)
    gr1.switch()

     实际上,greenlet就是通过switch方法在不同的任务之间进行切换。

    gevent

    from gevent import monkey; monkey.patch_all()
    import gevent
    import requests
    
    def f(url):
        print('GET: %s' % url)
        resp = requests.get(url)
        data = resp.text
        print('%d bytes received from %s.' % (len(data), url))
    
    gevent.joinall([
            gevent.spawn(f, 'https://www.python.org/'),
            gevent.spawn(f, 'https://www.yahoo.com/'),
            gevent.spawn(f, 'https://github.com/'),
    ])

    通过joinall将任务f和它的参数进行统一调度,实现单线程中的协程。代码封装层次很高,实际使用只需要了解它的几个主要方法即可。

  • 相关阅读:
    protobuf自解释message
    protobuf编码
    proto3语法
    proto2语法
    protobuf简介
    poi处理大EXCEL文件总结
    POI-处理大Excel文件(xlsx写)
    POI-处理大Excel文件(xlsx)
    POI-处理大Excel文件(xls)
    RedHat 6.4 RHCS GFS2安装
  • 原文地址:https://www.cnblogs.com/yxy-linux/p/5695827.html
Copyright © 2011-2022 走看看