非阻塞IO - 编程模型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非阻塞IO - 编程模型相关的知识,希望对你有一定的参考价值。
在非阻塞IO编程模型中,一个线程在数据可用通道上被阻塞,如下所示,
在python中,
while True:
readers, _, _ = select.select([sys.stdin, sock], [], []) # blocked select()
for reader in readers:
if reader is sock:
print(sock.recv(1000).decode('utf-8'))
else:
msg = sys.stdin.readline()
sock.send(msg.encode('utf-8'))
在java中,
public void run() {
while(true){
try{
executeCycle();
} catch(IOException e){
e.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void executeCycle() throws IOException {
takeNewSockets();
readFromSockets();
writeToSockets();
}
在非阻塞IO编程模型中,执行流程通常遵循无限循环模式,主要(仅)负责查找可用信道数据(就绪)并使用可用信道执行IO。
在所有通道都忙(持续时间)的情况下,非阻塞IO编程模型是否允许执行带有/不带无限循环的nio的线程同时执行同一线程中的另一个CPU绑定任务?
答案
这些API通常允许您为选择步骤指定超时。也就是说,等待任何通道准备就绪的时间量,如果超时中没有通道准备就返回空集。您还可以执行立即返回的非块选择。
在python中:
while True:
readers, _, _ = select.select([sys.stdin, sock], [], [], 0) # non-block select
# readers could be an empty list
if readers:
for reader in readers:
if reader is sock:
print(sock.recv(1000).decode('utf-8'))
else:
msg = sys.stdin.readline()
sock.send(msg.encode('utf-8'))
else:
some_other_operations() # but only when no channel is ready
Java的Selector
类有类似的方法,如selectNow()
和select(long timeout)
,你可以使用。
另一答案
我认为在同一个线程中同时执行其他操作并不容易。您必须调用代码来执行其他操作。您如何保证控制返回到在合理的时间范围内检查输入?
但是,如果您有一个单独的线程来处理其他操作,那么只要有可用资源,运行时系统就会分配这些线程。如果你在繁忙的循环中使用类似Thread.sleep(100)的东西,那么这将确保这个繁忙的循环不会耗尽这么多的资源,以至于其他东西将能够同时运行,而你不必做任何特别的事情。
但是,您必须确保在输入检查程序线程和其他线程之间共享的任何资源都以线程安全的方式处理。
以上是关于非阻塞IO - 编程模型的主要内容,如果未能解决你的问题,请参考以下文章