python socket非阻塞及python队列Queue
一. python非阻塞编程的settimeout与setblocking+select
原文:www.th7.cn/Program/Python/201406/214922.shtml
侧面认证Python的settimeout确实应该是非阻塞,这次使用select+setblocking和settimeout来做个对比,以此来证明。
首先我设置socket为非阻塞的。然后使用select来监控套接字。
#!/usr/bin/env python
# encoding: utf-8
import socket
import threading
import Queue
import time
import select
class worker(threading.Thread):
def __init__(self,name,queue):
self.data=queue
super(worker,self).__init__(name=name)
def run(self):
for i in range(10000):
self.data.put(i) class customer(threading.Thread):
def __init__(self,name,queue):
super(customer,self).__init__(name=name)
self.data=queue
def scan(self,ip,port):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setblocking(False) #non_blocking
#s.settimeout(0.1)
results=s.connect_ex((ip,port))
#print results
a,b,c=select.select([],[s,],[s,],0.1)#设置超时时间0.1秒,这里我根据前面博文的总结得出来的。
#当connect连接成功的时候,代表Tcp3次握手完成,此时变成可写状态
if b:#如果socket可写,代表了端口是开放的
print port
s.close()
def run(self):
while True:
try:
a=self.data.get(1,5)
except:
break
else:
ip='220.181.136.241'
self.scan(ip,a)
def main():
start=time.time()
queue=Queue.Queue()
pool=[]
worke=worker('firebroo',queue)
worke.start()
for i in range(100):
a=customer('firebroo',queue)
pool.append(a)
for i in pool:
i.start()
worke.join()
for i in pool:
i.join()
print time.time()-start
del pool[:] if __name__=='__main__':
main()
大概花费17.5秒执行完毕。下面我使用settimeout。
#!/usr/bin/env python# encoding: utf-8
import socket
import threading
import Queue
import time
import select
class worker(threading.Thread):
def __init__(self,name,queue):
self.data=queue
super(worker,self).__init__(name=name)
def run(self):
for i in range(10000):
self.data.put(i) class customer(threading.Thread):
def __init__(self,name,queue):
super(customer,self).__init__(name=name)
self.data=queue
def scan(self,ip,port):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#s.setblocking(False)
s.settimeout(0.1)#为了和前面保持一致,当然得设置0.1秒
results=s.connect_ex((ip,port))
if results==0:#connect_ex中0代表端口开放,3次握手完成
print port
#print results
#a,b,c=select.select([],[s,],[s,],0.1)#设置超时时间0.1秒,这里我根据前面博文的总结得出来的。
#当connect连接成功的时候,代表Tcp3次握手完成,此时变成可写状态
#if b:#如果socket可写,代表了端口是开放的
# print port
s.close()
def run(self):
while True:
try:
a=self.data.get(1,5)
except:
break
else:
ip='220.181.136.241'
self.scan(ip,a)
def main():
start=time.time()
queue=Queue.Queue()
pool=[]
worke=worker('firebroo',queue)
worke.start()
for i in range(100):
a=customer('firebroo',queue)
pool.append(a)
for i in pool:
i.start()
worke.join()
for i in pool:
i.join()
print time.time()-start
del pool[:] if __name__=='__main__':
main()
时间大概是17.4。这两个测试结果应该可以说是一样的,难免会有误差。
总结:由此我可以说Python的settimeout这个API确实是非阻塞。和select+setblocking效果是一样的
二. Python Queue的使用
原文:doudouclever.blog.163.com/blog/static/1751123102012111192621448/
python 中,队列是线程间最常用的交换数据的形式。Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。
1. 阻塞模式导致数据污染
import Queue
q = Queue.Queue(10)
for i in range(10):
myData = 'A'
q.put(myData)
myData = 'B'
这
是一段极其简单的代码,但我总是不能获得期望的结果(期望在队列中写入10个A,却总是混杂了B)。原来,Queue.put()默认有 block =
True 和 timeou 两个参数。当 block = True 时,写入是阻塞式的,阻塞时间由 timeou
确定。正因为阻塞,才导致了后来的赋值污染了处于阻塞状态的数据。Queue.put()方法加上 block=False
的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常。
2. 无法捕获 exception Queue.Empty 的异常
while True:
......
try:
data = q.get()
except Queue.Empty:
break
我
的本意是用队列为空时,退出循环,但实际运行起来,却陷入了死循环。这个问题和上面有点类似:Queue.get()默认的也是阻塞方式读取数据,队列为
空时,不会抛出 except Queue.Empty ,而是进入阻塞直至超时。 加上block=False 的参数,问题迎刃而解。
3. Queue常用方法汇总
Queue.Queue(maxsize=0) FIFO, 如果maxsize小于1就表示队列长度无限
Queue.LifoQueue(maxsize=0) LIFO, 如果maxsize小于1就表示队列长度无限
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.get([block[, timeout]]) 读队列,timeout等待时间
Queue.put(item, [block[, timeout]]) 写队列,timeout等待时间
Queue.queue.clear() 清空队列
python socket非阻塞及python队列Queue的更多相关文章
- Python Socket单线程+阻塞模式
Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要: 前面第五篇(一)中的一个Socket例子其实就是 ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...
- python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)
1.队列(queue) 用法: import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里 作用: 1)解耦 2)提高效率 class qu ...
- python学习笔记——multiprocessing 多进程组件-队列Queue
1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...
- python基本数据结构栈stack和队列queue
1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...
- [b0027] python 归纳 (十二)_并发队列Queue的使用
# -*- coding: UTF-8 -*- """ 学习队列 Queue 总结: 1. 队列可以设置大小,也可以无限大小 2. 空了,满了,读写时可以阻塞,也可以报错 ...
- python IO非阻塞模型
server端 import socket sk = socket.socket() sk.bind(('127.0.0.1', 8010)) sk.setblocking(False) # sk.l ...
- python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题
今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ...
随机推荐
- Mac电脑怎么显示隐藏文件、xcode清除缓存
1.删除Xcode中多余的证书provisioning profile 手动删除: Xcode6 provisioning profile path: ~/Library/MobileDevice/P ...
- 628. Maximum Product of Three Numbers@python
Given an integer array, find three numbers whose product is maximum and output the maximum product. ...
- 51nod 1242 斐波那契数列的第N项——数学、矩阵快速幂
普通算法肯定T了,所以怎么算呢?和矩阵有啥关系呢? 打数学符号太费时,就手写了: 所以求Fib(n)就是求矩阵 | 1 1 |n-1 第一行第一列的元素. | 1 0 | 其实学过线代 ...
- 十:MYSQL中的事务
前言: 因为没有多少时间和精力,目前无法深入研究数据库中的事务,比如 但是,对于事务的一些基本知识,还是需要牢牢掌握的,做到了解事务的基本常识,在实际开发中能够理解各个持久层框架对事务的处理 一:是么 ...
- docker系列之安装配置
由于docker支持内核3.8以上的,所以我们要安装centos7系统,这个系统的内核是3.10,来支持docker使用环境 一.用UItralSo制作u盘启动 打开找到要做u盘启动的镜像 二.安装C ...
- 常用JS方法整理
目录: 截取指定字节数的字符串 判断是否微信 获取时间格式的几个举例 获取字符串字节长度 对象克隆.深拷贝 组织结构代码证验证 身份证号验证 js正则为url添加http标识 URL有效性校验方法 自 ...
- 查找闲置ip
首先ping 一下该网段的广播地址,如ping 192.168.0.255 ,然后使用arp -a就可以查看到那些地址是被使用的,以及网卡的mac值.剩余的是暂时还未被使用的,当然没开机的机器就看不出 ...
- BZOJ 4557: [JLoi2016]侦察守卫
题目大意:每个点有一个放置守卫的代价,同时每个点放置守卫能覆盖到的距离都为d,问覆盖所有给定点的代价是多少. 题解: 树形DP f[x][y]表示x子树中所有点都已经覆盖完,并且x还能向上覆盖y层的最 ...
- css 元素垂直居中
通用 <div id="parent"> <div id="child">Content here</div> </d ...
- 03006_Servlet简介
1.什么是Servlet (1)Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源: (2)Servlet的实质就是java代码 ...