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

简介:

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

1、同步方式代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#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、协程(异步)方式代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

#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:



相关阅读:

1、Gevent tutorial中文翻译

2、Python协程:从yield/send到async/await


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

本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1439034如需转载请自行联系原作者


RQSLT

相关文章
|
2月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
77 3
|
2月前
|
存储 大数据 Python
利用Python的高级语法优化代码可以显著提高代码的可读性、简洁性和性能
利用Python的高级语法优化代码可以显著提高代码的可读性、简洁性和性能
41 1
|
2月前
|
调度 数据库 Python
掌握Python中的异步编程,提升I/O密集型任务的性能
掌握Python中的异步编程,提升I/O密集型任务的性能
47 0
|
3月前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
3月前
|
测试技术 持续交付 Apache
性能怪兽来袭!Python+JMeter+Locust,让你的应用性能飙升🦖
【10月更文挑战第10天】随着互联网应用规模的不断扩大,性能测试变得至关重要。本文将探讨如何利用Python结合Apache JMeter和Locust,构建高效且可定制的性能测试框架。通过介绍JMeter和Locust的使用方法及Python的集成技巧,帮助应用在高负载下保持稳定运行。
81 2
|
3月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
156 1
|
3月前
|
存储 数据处理 Python
深入解析Python中的生成器:效率与性能的双重提升
生成器不仅是Python中的一个高级特性,它们是构建高效、内存友好型应用程序的基石。本文将深入探讨生成器的内部机制,揭示它们如何通过惰性计算和迭代器协议提高数据处理的效率。
|
3月前
|
缓存 并行计算 算法
如何提高 Python 高阶函数的性能?
【10月更文挑战第2天】
23 3
|
3月前
|
测试技术 持续交付 Apache
性能怪兽来袭!Python+JMeter+Locust,让你的应用性能飙升🦖
【10月更文挑战第2天】随着互联网应用规模的不断膨胀,性能测试变得至关重要。本文将介绍如何利用Python结合Apache JMeter和Locust构建高效且可定制的性能测试框架。Apache JMeter是一款广泛使用的开源负载测试工具,适合测试静态和动态资源;Locust则基于Python,通过编写简单的脚本模拟HTTP请求,更适合复杂的测试场景。
78 3
|
2月前
|
NoSQL 关系型数据库 MySQL
python协程+异步总结!
本文介绍了Python中的协程、asyncio模块以及异步编程的相关知识。首先解释了协程的概念和实现方法,包括greenlet、yield关键字、asyncio装饰器和async/await关键字。接着详细讲解了协程的意义和应用场景,如提高IO密集型任务的性能。文章还介绍了事件循环、Task对象、Future对象等核心概念,并提供了多个实战案例,包括异步Redis、MySQL操作、FastAPI框架和异步爬虫。最后提到了uvloop作为asyncio的高性能替代方案。通过这些内容,读者可以全面了解和掌握Python中的异步编程技术。
52 0