协程的作用 Python

1.协程的含义和实现

协程是单进程单线程的超越函数的调度机制,它通过一定的调度手段进行调度。

(Python使用generator机制,greenlet使用汇编控制对程序指向来实现)。

2.协程有什么作用

计算机分为IO bound 和CPU bound两种类型的task。在这两种情况中,协程都没有什么作用。

为什么?

在CPU bound task中,cpu被用来执行任务去了。这类task,即使一个一个方法的执行,跟协程的效率还要高出一点点,使用协程没有意义。IO bound task中,CPU已经陷入系统调用之中,用户空间的调度无论如何也是没有CPU的,这样情况下,协程只能死死的。在这样情况下,祈求高效率,怎么可能。

协程只有在非常有限制的情况下,才有一些用处,在单进程单线程任务中的交互青霞,才有它的用武之地。

3.协程不是未来(反驳赖勇浩)。协程是很早之前就有的。很早之前,windows就有纤程的概念,Linux不太确定。但是它一直作为小众的API而存在。

4.协程的两个评测:

import gevent
import random
import time

def task(pid):
    """
    Some non-deterministic task
    """
    for i in range(1000):
        random.randint(0,20)

def synchronous():
    for i in range(1,10000):
        task(i)

def asynchronous():
    threads = [gevent.spawn(task, i) for i in xrange(10000)]
    gevent.joinall(threads)

print(‘Synchronous:‘)
t = time.time()
synchronous()
diff = time.time() -t
print "diff is %f" %diff

print(‘Asynchronous:‘)
t = time.time()
asynchronous()
diff = time.time() -t
print "diff is %f" %diff

结果:

Synchronous:
diff is 22.333482
Asynchronous:
diff is 22.422071

2.IO bound

import gevent.monkey
gevent.monkey.patch_socket()

import gevent
import urllib2
import time

def fetch(pid):
    response = urllib2.urlopen(‘http://127.0.0.1:8080/‘)
    result = response.read()

    return result

def synchronous():
    for i in range(1,100):
        fetch(i)

def asynchronous():
    threads = []
    for i in range(1,100):
        threads.append(gevent.spawn(fetch, i))
    gevent.joinall(threads)

print(‘Synchronous:‘)
t = time.time()
synchronous()
diff = time.time() - t
print "diff is %f" %diff

print(‘Asynchronous:‘)
t = time.time()
asynchronous()
diff = time.time() - t
print "diff is %f" %diff

结果为:

Synchronous:
diff is 0.791572
Asynchronous:
diff is 0.997519

上述例子结果只是单次运行结果,跟使用机器相关性很大。

5.gevnet+flask是一个很流行的用法,但是gevent真正有用的是libev,它是使用epoll(linux), kqueue(bsd),IOCP(windows)实现network IO,并在轮询处理signal,signal,callback的lib。

end。。。。。。一家之言,欢迎拍砖。。

时间: 2024-10-11 22:53:34

协程的作用 Python的相关文章

Python:线程、进程与协程(1)——概念

最近的业余时间主要放在了学习Python线程.进程和协程里,第一次用python的多线程和多进程是在两个月前,当时只是简单的看了几篇博文然后就跟着用,没有仔细去研究,第一次用的感觉它们其实挺简单的,最近这段时间通过看书, 看Python 中文官方文档等等相关资料,发现并没有想想中的那么简单,很多知识点需要仔细去理解,Python线程.进程和协程应该是Python的高级用法.Python的高级用法有很多,看看Python 中文官方文档就知道了,当然有时间看看这些模块是怎么实现的对自己的提高是很有帮

谁说Python协程是鸡肋的!站出来我不打死他!这么牛逼的协程!

文章思路:本文将先介绍协程的概念,然后分别介绍Python2.x与3.x下协程的用法,最终将协程与多线程做比较并介绍异步爬虫模块. 协程 概念 协程,又称微线程,纤程,英文名Coroutine.协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换).但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行. 进群:548377875   即可获取数十套PDF哦! Python2.x协程 python2.x协程应用: y

Python异步IO之协程(一):从yield from到async的使用

引言:协程(coroutine)是Python中一直较为难理解的知识,但其在多任务协作中体现的效率又极为的突出.众所周知,Python中执行多任务还可以通过多进程或一个进程中的多线程来执行,但两者之中均存在一些缺点.因此,我们引出了协程. Tips 欲看完整代码请见:我的GitHub 为什么需要协程?首先,我们需要知道同步和异步是什么东东,不知道的看详解.简单来说:[同步]:就是发出一个“调用”时,在没有得到结果之前,该“调用”就不返回,“调用者”需要一直等待该“调用”结束,才能进行下一步工作.

协程及Python中的协程

阅读目录 1 协程 2 Python中如何实现协程 回到顶部 1 协程 1.1协程的概念 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.(其实并没有说明白~) 我觉得单说协程,比较抽象,如果对线程有一定了解的话,应该就比较好理解了. 那么这么来理解协程比较容易: 线程是系统级别的,它们是由操作系统调度:协程是程序级别的,由程序员根据需要自己调度.我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子程序:别的子程

python协程的理解

一.介绍 什么是并发?并发的本质就是切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制):1.任务发生阻塞2.计算任务时间过长,需要让出cpu给高优先级的程序 协程,又称微线程,是一种用户态的轻量级线程.协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置,当程序中存在大量不需要CPU的操作时(IO),适用于协程.协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到I/

10 线程 协程 socketserver 基于udp的socketserver

线程进程 操作系统的作用: 1.把硬件丑陋复杂的接口隐藏起来,为应用程序提供良好接口 2.管理,调用进程,并且把进程之间对硬件的竞争变得有序化 多道技术: 1.产生背景:为了实现单cpu下的并发效果 2.分为两部分: 1:空间上的复用(必须实现硬件层面的隔离) 2:时间上的复用(复用cpu的时间片) 什么切换? 1:正在执行的任务遇到的阻塞 2:正在执行的任务运行时间过长 进程:正在运行的一个过程/一个任务,由操作系统负责调用,然后由cpu负责执行程序:就是程序员写的代码并发:伪并行,单核+多道

tornado协程(coroutine)原理

tornado中的协程是如何工作的 本文将按以下结构进行组织,说明tornado中协程的执行原理 协程定义 生成器和yield语义 Future对象 ioloop对象 函数装饰器coroutine 总结 协程定义 Coroutines are computer program components that generalize subroutines for nonpreemptive multitasking, by allowing multiple entry points for su

FastRPC 3.2 发布,高性能 C++ 协程 RPC 框架

用过go erlang gevent的亲们应该都会知道协程在应用中带来的方便. 如果对协程不理解的同学,通过阅读下面例子可以快速了解我们框架的协程的意义,已了解的可以跳过这部分. 协程例子:假设我们要发个Get请求获取百度首页内容: php同步方式:$result = file_get_contents("http://www.baidu.com"), php果然是世界上最好的语言,多么简洁. 然后java和c++的同学开始不屑了: "呵呵, 同步,鄙视你不解释."

爬虫 + 数据分析 - 4 异步协程, selenium使用, 自动登录

一.单线程+异步协程 1.基本概念: event_loop:事件循环,相当于一个无限循环,我们可以把一些特殊函数注册(放置)到这个事件循环上, 当满足某些条件的时候,函数就会被循环执行.程序是按照设定的顺序从头执行到尾,运行的次数也是完全按照设定. 当在编写异步程序时,必然其中有部分程序的运行耗时是比较久的,需要先让出当前程序的控制权,让其在背后运行, 让另一部分的程序先运行起来.当背后运行的程序完成后,也需要及时通知主程序已经完成任务可以进行下一步操作, 但这个过程所需的时间是不确定的,需要主