python非阻塞

settimeout

setblocking+select(了解select)

继续昨天的干活,这次我使用select+setblocking和settimeout来做个对比,以次来证明。

首先我设置socket为非阻塞的。然后使用select来监控套接字。

#!/usr/bin/env python# encoding: utf-8import socketimport threadingimport Queueimport timeimport selectclass 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)        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-8import socketimport threadingimport Queueimport timeimport selectclass 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效果是一样的

时间: 2025-01-12 23:07:57

python非阻塞的相关文章

转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的.下面记录下分别基于Select/Poll/Epoll的echo server实现.Python Select Server,可监控事件数量有限制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

python + flask + uwsgi + gevent + nginx 环境搭建(非阻塞)

Flask是Python中一个微型的Web开发框架.在debug 模式 或 单纯的 uwsgi模式下,flask是阻塞模式的,也就是说一次只能效应一个请求,或者在uwsgi 开启多进程,响应已知的请求个数:我们这里使用  uwsgi 和 gevent 配合nginx 解决flask的阻塞模式. 1.环境 CentOS Linux release 7.0.1406 (Core) Python 2.7.5 2.安装类库 yum install python-devel zlib-devel bzip

# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # Select\Poll\Epoll异步IO 以及selectors模块 # Python队列/RabbitMQ队列

1 # 进程/线程/协程 2 # IO:同步/异步/阻塞/非阻塞 3 # greenlet gevent 4 # 事件驱动与异步IO 5 # Select\Poll\Epoll异步IO 以及selectors模块 6 # Python队列/RabbitMQ队列 7 8 ############################################################################################## 9 1.什么是进程?进程和程序之间有什么

异步非阻塞IO的Python Web框架--Tornado

Tornado的全称是Torado Web Server,从名字上就可知它可用作Web服务器,但同时它也是一个Python Web的开发框架.最初是在FriendFeed公司的网站上使用,FaceBook收购之后便进行了开源. 作为Web框架,是一个轻量级的Web框架,类似于另一个Python web 框架Web.py,其拥有异步非阻塞IO的处理方式. 作为Web服务器,Tornado有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它Python web应用框架进行对

Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型

使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为文末的链接,以及自己的补充理解. 完整代码 1 #!/usr/bin/python 2 # ============================================================= 3 # File Name: async_base.py 4 # Author: L

4月27日 python学习总结 GIL、进程池、线程池、同步、异步、阻塞、非阻塞

一.GIL:全局解释器锁 1 .GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在解释器身上的, 同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码 2.GIL的优缺点: 优点:  保证Cpython解释器内存管理的线程安全 缺点:同一进程内所有的线程同一时刻只能有一个执行,也就说Cpython解释器的多线程无法实现并行 二.GIL与多线程 有了GIL的存在,同一时刻同一进程中只有一个线程被执行 听到这里,有的同学立马质问:进程可以利用多核,但是开销大,而python的多线程开销

Python并发编程之同步\异步and阻塞\非阻塞

一.什么是进程 进程: 正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程和程序的区别: 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程. 需要强调的是:同一个程序执行两次,那也是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播郭德纲,一个可以播高晓松. 二.并行和并发 无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务 (一)并发:是伪并行,即

{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块

阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchronous I/O) 六 IO模型比较分析 七 selectors模块 一 IO模型介绍 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能

python第三十七天,GIL全局解释器锁*****,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe