当我听说多线程编程时,我想到了加速我的程序的机会,但不是吗?在import eventlet

from eventlet.green import socket

from iptools import IpRangeList

class Scanner(object):

def __init__(self, ip_range, port_range, workers_num):

self.workers_num = workers_num or 1000

self.ip_range = self._get_ip_range(ip_range)

self.port_range = self._get_port_range(port_range)

self.scaned_range = self._get_scaned_range()

def _get_ip_range(self, ip_range):

return [ip for ip in IpRangeList(ip_range)]

def _get_port_range(self, port_range):

return [r for r in range(*port_range)]

def _get_scaned_range(self):

for ip in self.ip_range:

for port in self.port_range:

yield (ip, port)

def scan(self, address):

try:

return bool(socket.create_connection(address))

except:

return False

def run(self):

pool = eventlet.GreenPool(self.workers_num)

for status in pool.imap(self.scan, self.scaned_range):

if status:

yield True

def run_std(self):

for status in map(self.scan, self.scaned_range):

if status:

yield True

if __name__ == '__main__':

s = Scanner(('127.0.0.1'), (1, 65000), 100000)

import time

now = time.time()

open_ports = [i for i in s.run()]

print 'Eventlet time: %s (sec) open: %s' % (now - time.time(),

len(open_ports))

del s

s = Scanner(('127.0.0.1'), (1, 65000), 100000)

now = time.time()

open_ports = [i for i in s.run()]

print 'CPython time: %s (sec) open: %s' % (now - time.time(),

len(open_ports))

结果:

^{pr2}$

我的问题是,如果我不在我的笔记本电脑上运行这段代码,而是在服务器上运行,并设置更多的workers值,它会比CPython的版本运行得更快?

线程的优点是什么?在

添加:

所以我用原始的cpython线程重写应用程序import socket

from threading import Thread

from Queue import Queue

from iptools import IpRangeList

class Scanner(object):

def __init__(self, ip_range, port_range, workers_num):

self.workers_num = workers_num or 1000

self.ip_range = self._get_ip_range(ip_range)

self.port_range = self._get_port_range(port_range)

self.scaned_range = [i for i in self._get_scaned_range()]

def _get_ip_range(self, ip_range):

return [ip for ip in IpRangeList(ip_range)]

def _get_port_range(self, port_range):

return [r for r in range(*port_range)]

def _get_scaned_range(self):

for ip in self.ip_range:

for port in self.port_range:

yield (ip, port)

def scan(self, q):

while True:

try:

r = bool(socket.create_conection(q.get()))

except Exception:

r = False

q.task_done()

def run(self):

queue = Queue()

for address in self.scaned_range:

queue.put(address)

for i in range(self.workers_num):

worker = Thread(target=self.scan,args=(queue,))

worker.setDaemon(True)

worker.start()

queue.join()

if __name__ == '__main__':

s = Scanner(('127.0.0.1'), (1, 65000), 5)

import time

now = time.time()

s.run()

print time.time() - now

结果是Cpython's thread: 1.4 sec

我认为这是一个非常好的结果。我将nmap扫描时间作为标准:$ nmap 127.0.0.1 -p1-65000

Starting Nmap 5.21 ( http://nmap.org ) at 2012-10-22 18:43 MSK

Nmap scan report for localhost (127.0.0.1)

Host is up (0.00021s latency).

Not shown: 64986 closed ports

PORT STATE SERVICE

53/tcp open domain

80/tcp open http

443/tcp open https

631/tcp open ipp

3306/tcp open mysql

6379/tcp open unknown

8000/tcp open http-alt

8020/tcp open unknown

8888/tcp open sun-answerbook

9980/tcp open unknown

27017/tcp open unknown

27634/tcp open unknown

28017/tcp open unknown

39900/tcp open unknown

Nmap done: 1 IP address (1 host up) scanned in 0.85 seconds

我现在的问题是:线程是如何在Eventlet中实现的,正如我所理解的,这不是线程,而是Eventlet特有的东西,为什么它们不能加快任务的速度?在

Eventlet被许多主要的项目使用,如OpenStack等。

但为什么呢?只是以异步方式对数据库执行繁重的查询还是别的什么?在

python中的多线程的优点_Python中多线程编程的优点是什么?相关推荐

  1. Python基础_第3章_Python中的循环结构

    Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...

  2. Python基础_第5章_Python中的数据序列

    Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...

  3. python怎么宏定义符号变量_python中定义宏

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 什么是宏? 宏类似python中的函数,可以传参数进去,但不能有返回值! 在实际 ...

  4. python中 r是什么意思_python中r含义

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 另外encoding可以指定解码格式,utf-8是现在的主流编码方式,如果没有指 ...

  5. python post与get的区别_python中get和post有什么区别

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.sfkyty.com ...

  6. python深复制与浅复制_Python中的深拷贝和浅拷贝详解

    要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, ...

  7. python运行mcmc为何老出错_python中mcmc方法的实现

    MCMC方法在贝叶斯统计中运用很多,MIT发布的EMCEE是实现的比较好的.介绍页面在下面.源代码中examples里的代码可以帮助理解各种功能,特别是line.py 列出了最小二乘法,最大似然法和M ...

  8. python实例属性与类属性_Python中的类属性和实例属性引发的一个坑-续

    上篇文章Python 中的类属性和实例属性,我们探讨了类属性和实例属性引发的一个小坑.总结了类属性和实例属性的区别如下:类属性可以被类和实例调用,实例属性只能被实例调用 类属性不会随着实例的调用而改变 ...

  9. python计算数组元素的和_python中数组的运算

    Python中进行数组的运算需要调用NumPy包. 其官网是:http://www.numpy.org/​www.numpy.org NumPy是Python语言的一个扩充程序库.它支持高级大量的维度 ...

  10. python中格式化字符串的作用_python中字符串格式化的意义(化妆)

    格式 描述 %%百分号标记 #就是输出一个% %c字符及其ASCII码 %s字符串 %d有符号整数(十进制) %u无符号整数(十进制) %o无符号整数(八进制) %x无符号整数(十六进制) %X无符号 ...

最新文章

  1. 从网络上获取一张图片简单的
  2. 打开摄像头,2D插画实时变动画,中国程序媛出品,Demo在线可玩
  3. 微视已死,腾讯战略放弃微视,大牛纷纷离职,PMcaff--行业内部解读
  4. 在Linux上编写并运行Python文件
  5. 《剑指offer》链表中环的入口节点
  6. java lambda表达式_凯哥带你从零学大数据系列之Java篇---第二十二章:Lambda表达式...
  7. 作者:汪疆平(1970-),男,北明软件有限公司技术研究院高级工程师、副院长。...
  8. php复制目录及文件
  9. 关联Left Outer Join的第一条记录
  10. abp 基于api接口的页面内容提交
  11. HashSet的自定义实现
  12. html5video拼接屏一部分黑屏,拼接屏常见问题与解决方法
  13. java继承序列化_Java中具有继承的对象序列化
  14. c语言实验报告指针数组,C语言实验报告-数组与指针.doc
  15. Cocos2d-x游戏开发之骨骼动画详解-Spine
  16. 虎胆龙威5java7723,汉米尔顿腕表联手《虎胆龙威5》再度演绎热血豪情
  17. 使用Matlab求解矩阵方程的解
  18. Altium Designer 19卡顿的解决方法
  19. SpringCloud Hystrix服务熔断和降级的理解
  20. SQL-DQL(数据库查询语言)

热门文章

  1. form中的fieldset标签应用
  2. decode和case的用法
  3. 异步请求引发的Chrome死锁
  4. 程序.NET Framework版本升级,重签名,重链接,批量签名工具
  5. CSS教程:实例讲解定位Position
  6. 51 -算法 -LeetCode 53最大子序和 动态规划
  7. 类的使用经典案例使用类的成员函数显示时间、找出元素的最大值【C++面向对象编程】
  8. git 9个小命令(三年修仙五年摸鱼也有喔) 一条龙服务
  9. 为什么要预留字段_PaperYY为什么会免费论文查重?
  10. ironpython 开发_[IronPython]IronPython开发环境的安装与设定