python 多路复用io_详解Python IO口多路复用

详解Python IO口多路复用,进程,数据,区别,操作,定义

详解Python IO口多路复用

易采站长站,站长之家为您整理了详解Python IO口多路复用的相关内容。

1、blocking和non-blocking的区别:

调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还准备数据的情况下会立刻返回。

2、synchronous IO和asynchronous IO的区别:

在说明synchronous IO和asynchronous IO的区别之前,需要先给出两者的定义。POSIX的定义是这样子的:

- A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;

- An asynchronous I/O operation does not cause the requesting process to be blocked;

两者的区别就在于synchronous IO做”IO operation”的时候会将process阻塞。按照这个定义,之前所述的blocking IO,non-blocking IO,IO multiplexing都属于synchronous IO。

有人会说,non-blocking IO并没有被block啊。这里有个非常“狡猾”的地方,定义中所指的”IO operation”是指真实的IO操作,就是例子中的recvfrom这个system call。non-blocking IO在执行recvfrom这个system call的时候,如果kernel的数据没有准备好,这时候不会block进程。但是,当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被block了,在这段时间内,进程是被block的。

而asynchronous IO则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到kernel发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block。

各个IO Model的比较如图所示:

062d9f1b5e367c5ee72d1355df68dcc8.png

通过上面的图片,可以发现non-blocking IO和asynchronous IO的区别还是很明显的。在non-blocking IO中,虽然进程大部分时间都不会被block,但是它仍然要求进程去主动的check,并且当数据准备完成以后,也需要进程主动的再次调用recvfrom来将数据拷贝到用户内存。而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。

以上就是详解Python IO口多路复用的详细内容,更多关于Python IO口多路复用的资料请关注我们其它相关文章!以上就是关于对详解Python IO口多路复用的详细介绍。欢迎大家对详解Python IO口多路复用内容提出宝贵意见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的频分多路复用是通过使用select、poll或epoll等函数来实现的。这些函数允许程序同时监视多个文件描述符的可读、可写或错误事件,从而实现对多个I/O通道的高效管理。 频分多路复用的主要优点是可以在单个线程中同时处理多个I/O操作,从而提高程序的并发性能。它适用于需要同时监听多个网络连接或文件描述符的场景,常见的应用包括网络服务器、聊天程序等。 在Python中,可以使用select模块提供的select函数来实现频分多路复用。该函数接受三个参数:可读文件描述符列表、可写文件描述符列表和错误文件描述符列表,然后返回就绪的文件描述符列表。 以下是一个简单的示例代码,演示了如何使用select函数实现频分多路复用: ```python import select import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8000)) server_socket.listen(5) inputs = [server_socket] outputs = [] while True: readable, writable, exceptional = select.select(inputs, outputs, inputs) for sock in readable: if sock is server_socket: client_socket, client_address = server_socket.accept() inputs.append(client_socket) else: data = sock.recv(1024) if data: print(data.decode()) if sock not in outputs: outputs.append(sock) else: inputs.remove(sock) if sock in outputs: outputs.remove(sock) sock.close() for sock in writable: sock.send(b'Hello, client!') outputs.remove(sock) for sock in exceptional: inputs.remove(sock) if sock in outputs: outputs.remove(sock) sock.close() ``` 在上述示例中,通过select.select函数来同时监听可读、可写和错误事件。当有新的客户端连接时,会将其加入到inputs列表中。读事件发生时,从客户端接收数据并将其输出。写事件发生时,向客户端发送数据。异常事件发生时,关闭连接。 总之,Python提供了一些函数和模块来实现频分多路复用,能够方便地处理多个I/O通道的并发操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值