加入收藏 | 设为首页 | 会员中心 | 我要投稿 武陵站长网 (https://www.50888.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

python中单线程非阻塞并发

发布时间:2022-12-03 11:00:53 所属栏目:PHP教程 来源:转载
导读: 我们在使用多线程并发处理IO操作时候,每个线程当发送一个请求之后,就得阻塞等待接受返回的数据,数据较少的时候,这样并发操作还行php单线程,但是当数据非常庞大的时候,等待时间就会非

我们在使用多线程并发处理IO操作时候,每个线程当发送一个请求之后,就得阻塞等待接受返回的数据,数据较少的时候,这样并发操作还行php单线程,但是当数据非常庞大的时候,等待时间就会非常漫长,那么我们可以使用单线程非阻塞,就是使用一个线程逐个发送每一个请求,不用等待数据的返回操作,然后全都发送完毕,在逐个的接受每一个请求返回的数据

其中会使用到select模块

select模块就是用于监听每一个请求对象的变化

其中有三个方法

select(rlist, wlist, xlist, timeout=None),其本质就是调用每一个socket对象中的fileno()函数进行监听

rlist 表示列表中的每一个对象都是服务端返回的数据变化的socket对象

wlist 列表中每一个对象表示与服务端连接成功之后的socket对象

xlist 列表表示出现错误的socket对象

timeout 表示隔多长时间检测一次,

注意 select使循环检测的,最多1024个socket对象poll方法,表示无限制socket对象,循环检测epoll 方法,表示无限制不循环检测

具体代码:

import socket
import select
socket_list = []
conn_list = []
client1 = socket.socket()
client1.setblocking(False)
try:
    client1.connect(("www.baidu.com", 80))
except BlockingIOError:
    pass
socket_list.append(client1)
client2 = socket.socket()
client2.setblocking(False)
try:
    client2.connect(("www.sogou.com",80))
except BlockingIOError:
    pass
socket_list.append(client2)
conn_list.append(client1)
conn_list.append(client2)
while True:
    rlist,wlist,elist = select.select(socket_list,conn_list,[],0.05)
    for sk in wlist:
        sk.sendall(b"GET /s?wd=hello HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n")
        conn_list.remove(sk)
    for sk in rlist:
        data_list = []
        while True:
            try:
                data = sk.recv(8096)
                data_list.append(data)
                if not data:
                    break
            except BlockingIOError:
                break
        ret = b''.join(data_list)
        print(ret.decode("utf-8"))
        sk.close()
        socket_list.remove(sk)
    if not socket_list:
        break

原文链接:

程序员说:42岁了,突然觉得研发前途渺茫

中国程序员数量达755万,全球排名第二

为什么都说程序员找不到女朋友,但是身边程序猿的却没一个单身的?

程序员说:30岁以上你还死磕技术,别说拿高薪,可能你连饭碗都会保不住

程序员被开除,老板:“有你参与的项目全黄了!”

笑话:一个测试工程师走进一家酒吧

笑话:面试官:请拿出一段体现你水平的代码。我: sudo rm -rf /*面试官:这体现了你哪方面能力?

python精选:Python 办公实战!?按姓名拆分 Excel 为单独文件,微信自动发给相应联系人

网友说:做开发,不被领导喜欢怎么办?

网友说:我奉劝各位,一定不能在职场透露自己的家庭条件

(编辑:武陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!