从两个简单例子窥视协程的惊人性能

我们用普通同步方式扫描10个端口,用协程(异步)方式扫描1000个端口,对比时间。

1、同步方式代码

#encoding=utf-8
#author: walker
#date: 2014-07-16
#function: 使用同步方式扫描10个端口

import time, socket, sys

def task(addr):
	sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	sock.settimeout(100)
	try:
		sock.connect(addr)
		print(‘Port ‘ + str(str(addr[1])) + ‘ is  open‘)
	except:
		pass
	finally:
		sock.close()

#扫描10个端口
def synchronous():
	for i in range(0, 10):
		task((‘127.0.0.1‘, i))

t0 = time.time()
synchronous()
t1 = time.time()
print(‘time: {}s‘.format(t1 - t0))

walker机器的测试结果为9.0110001564s ≈ 9s 。

2、协程(异步)方式代码

#encoding=utf-8
#author: walker
#date: 2014-07-16
#function: 使用协程(异步)方式扫描1000个端口

import gevent.monkey
gevent.monkey.patch_socket()

import gevent, socket, sys, time

def task(addr):
	sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	sock.settimeout(100)
	try:
		sock.connect(addr)
		print(‘Port ‘ + str(str(addr[1])) + ‘ is  open‘)
	except:
		pass
	finally:
		sock.close()

#扫描1000个端口
def asynchronous():
	threads = []
	for i in range(0, 1000):
		threads.append(gevent.spawn(task, (‘127.0.0.1‘, i)))
	gevent.joinall(threads)	

t0 = time.time()
asynchronous()
t1 = time.time()
print(‘time: {}s‘.format(t1 - t0))

walker机器的测试结果为2.08499979973s ≈ 2s 。

用同步方式扫描10个端口需要9s,而用协程扫描1000个端口仅需2s!从代码复杂性来看,asynchronous函数仅比synchronous函数多一行。也就是说协程以同步方式的代码复杂度实现了异步程序的性能!

Windows下使用gevent,建议安装二进制版本,先装greenlet,再装gevent:

http://www.lfd.uci.edu/~gohlke/pythonlibs/#greenlet

http://www.lfd.uci.edu/~gohlke/pythonlibs/#gevent

参考:Gevent tutorial中文翻译

*** walker * 2014-07-16 ***

从两个简单例子窥视协程的惊人性能,布布扣,bubuko.com

时间: 2024-08-06 11:58:32

从两个简单例子窥视协程的惊人性能的相关文章

python简单线程和协程学习

python中对线程的支持的确不够,不过据说python有足够完备的异步网络框架模块,希望日后能学习到,这里就简单的对python中的线程做个总结 threading库可用来在单独的线程中执行任意的python可调用对象.尽管此模块对线程相关操作的支持不够,但是我们还是能够用简单的线程来处理I/O操作,以减低程序响应时间. from threading import Thread import time def countdown(n): while n > 0: print('T-minus:

Caffe学习系列(9):运行caffe自带的两个简单例子

为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载.但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了. 注意:在caffe中运行所有程序,都必须在根目录下进行,否则会出错 1.mnist实例 mnist是一个手写数字库,由DL大牛Yan LeCun进行维护.mnist最初用于支票上的手写数字识别, 现在成了DL的入门练习库.征对mnist识别的专门模型是Lenet,算是最早的cnn模型了. mnist数据训

【转载】Caffe学习:运行caffe自带的两个简单例子

原文:http://www.cnblogs.com/denny402/p/5075490.html 为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载.但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了. 注意:在caffe中运行所有程序,都必须在根目录下进行,否则会出错 1.mnist实例 mnist是一个手写数字库,由DL大牛Yan LeCun进行维护.mnist最初用于支票上的手写数字识别, 现在成了D

Caffe学习使用__运行caffe自带的两个简单例子

为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载.但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了. 注意:在caffe中运行所有程序,都必须在根目录下进行. 1.mnist实例 mnist是一个手写数字库.mnist最初用于支票上的手写数字识别, 现在成了DL的入门练习库.征对mnist识别的专门模型是Lenet,算是最早的cnn模型了. mnist数据训练样本为60000张,测试样本为10000张,每

通过两个简单例子介绍avalon

<html> <head> <title>TODO supply a title</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="avalon.js"></s

lua编程之协程介绍

一,lua协程简介 协程(coroutine),意思就是协作的例程,最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程属于侵入式组件,线程实现的系统称之为抢占式多任务系统,而协程实现的多任务系统成为协作式多任务系统.线程由于缺乏yield语义,所以运行过程中不可避免需要调度,休眠挂起,上下文切换等系统开销,还需要小心使用同步机制保证多线程正常运行.而协程的运行指令系列是固定的,不需要同步机制,协程之间切换也只涉及到控制权的交换,相比较线程来说是非常轻便的.

Unity3D协程介绍 以及 使用

作者ChevyRay ,2013年9月28日,snaker7译  原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协程(Coroutines)的形式是我最喜欢的功能之一,几乎在所有的项目中,我都会使用它来控制运动,序列,以及对象的行为.在这个教程中,我将会说明协程是如何工作的,并且会附上一些例子来介绍它的用法. 协程介绍 Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator,它允许你为自

[转载]协程-cooperative multitasking

[转载]协程三讲 http://ravenw.com/blog/2011/08/24/coroutine-part-1-defination-and-classification-of-coroutine/ http://ravenw.com/blog/2011/09/01/coroutine-part-2-the-use-of-coroutines/ http://ravenw.com/blog/2011/09/06/coroutine-part-3-coroutine-and-continu

Unity中的协程(一)

这篇文章很不错的问题,推荐阅读英文原版: Introduction to Coroutines Scripting with Coroutines   这篇文章转自:http://blog.csdn.net/huang9012/article/details/38492937 协程介绍 在Unity中,协程(Coroutines)的形式是我最喜欢的功能之一,几乎在所有的项目中,我都会使用它来控制运动,序列,以及对象的行为.在这个教程中,我将会说明协程是如何工作的,并且会附上一些例子来介绍它的用法