python中的多线程的优点_Python中多线程编程的优点是什么?

当我听说多线程编程时,我想到了加速我的程序的机会,但不是吗?在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等。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值