- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的问题是:select
表示有数据要读,有什么就读什么,不想等max
存在的金额。如果 max
<= 0 然后读取等待直到遇到 EOF,如果 max
>0 读取块直到 max
字节可以读取。
我不想要这个,我想阅读任何数量的 select 把它放在“准备阅读”列表中。 read(1) 是不切实际的,因为这将涉及到大量的读取调用。但它不能阻塞。
有没有办法在 select 返回时找出缓冲区中存在的数量(如果它返回表明可以读取某些内容,而不是超时)并读取该数量?有没有办法使用max
就像使用套接字一样?它立即读取尽可能多的内容,然后返回?
解决方案可能是将文件置于非阻塞模式以进行读取?我不确定,我没想到这种“直到 EOF”的行为。
我会继续阅读和尝试,但我只花了 30 分钟左右的时间却没有接近,这就是我呼吁你的原因。
注意
有很多问题询问如何让 recv 等待一定数量的输入,并使事情阻塞直到达到最大值,我是 不是 寻找这个。我的问题是它被阻塞了。
附录 setblocking(False)
没有用,我现在正在阅读如何使其在读取期间不阻塞。文档给了我希望:
stdin.read Found at: sys
read([size]) -> read at most size bytes, returned as a string.
If the size argument is negative or omitted, read until EOF is reached.
Notice that when in non-blocking mode, less data than what was
requested
may be returned, even if no size parameter was given.
def getInput(self):
log.log(log.INFO,"GetInput","Select")
readsReady = select.select((sys.stdin,),(),(),1)[0]
if len(readsReady) == 0:
#timed out
log.log(log.INFO,"GetInput","Select timed out")
if not self.toClose:
self.handler.post("GetInput")
else:
threads.getCurrentThread().removeAllHandlers()
else:
#OPTIMISED FOR READING 1
#log.log(log.INFO,"GetInput","Reading")
data = sys.stdin.read(1)
log.log(log.INFO,"GetInput","Read: "+data)
if data == "\n":
self.onInputHandler.post("OnInput",self.buffer)
self.buffer=""
else:
self.buffer+=data
self.handler.post("GetInput")
0.0147 Verbose 1 SocketReader Created reader
0.0156 Verbose 2 SocketWriter Created writer
0.0260 Information 0 SocketReadWriter Created and ready for: ('localhost', 8294)
0.0268 Information 3 GetInput Select
Hello World!
1.0281 Information 3 GetInput Select timed out
1.0584 Information 3 GetInput Select
2.0593 Information 3 GetInput Select timed out
2.0896 Information 3 GetInput Select
3.0900 Information 3 GetInput Select timed out
3.1203 Information 3 GetInput Select
4.1215 Information 3 GetInput Select timed out
4.1519 Information 3 GetInput Select
TEST!
5.1524 Information 3 GetInput Select timed out
5.1828 Information 3 GetInput Select
hello
6.1467 Information 3 GetInput Read: h
6.1770 Information 3 GetInput Select
7.1782 Information 3 GetInput Select timed out
7.2086 Information 3 GetInput Select
8.2098 Information 3 GetInput Select timed out
8.2401 Information 3 GetInput Select
9.2414 Information 3 GetInput Select timed out
9.2717 Information 3 GetInput Select
10.2723 Information 3 GetInput Select timed out
10.3026 Information 3 GetInput Select
k
10.7939 Information 3 GetInput Read: e
10.8243 Information 3 GetInput Select
10.8245 Information 3 GetInput Read: l
10.8547 Information 3 GetInput Select
10.8549 Information 3 GetInput Read: l
10.8851 Information 3 GetInput Select
10.8853 Information 3 GetInput Read: o
10.9155 Information 3 GetInput Select
10.9157 Information 3 GetInput Read:
10.9459 Information 3 GetInput Select
10.9461 Information 3 GetInput Read: k
10.9763 Information 3 GetInput Select
You said: hello
11.9775 Information 3 GetInput Select timed out
12.0123 Information 3 GetInput Select
13.0133 Information 3 GetInput Select timed out
13.0437 Information 3 GetInput Select
^C13.3985 Verbose 2 Threads Thread: 2 has ended
14.0442 Information 3 GetInput Select timed out
14.0746 Information 3 GetInput Select
14.3622 Verbose 1 Threads Thread: 1 has ended
15.0758 Information 3 GetInput Select timed out
15.1363 Information 3 GetInput Select
16.1373 Information 3 GetInput Select timed out
16.1677 Verbose 3 Threads Thread: 3 has ended
def getInput(self):
log.log(log.INFO,"GetInput","Select")
if sys.stdin.closed:
readsReady = []
else:
readsReady = select.select((sys.stdin,),(),(),1)[0]
if len(readsReady) == 0:
#timed out
log.log(log.INFO,"GetInput","Select timed out")
if not self.toClose:
self.handler.post("GetInput")
else:
threads.getCurrentThread().removeAllHandlers()
else:
data = sys.stdin.readline()
if len(data) == 0:
log.log(log.WARN,"GetInput","No data was returned indicating the file was closed")
self.handler.post("GetInput") #if this is a close event, the next
#timeout will deal with it
return
if data[-1] == "\n":
data = data[:-1]
log.log(log.INFO,"GetInput","Read: "+data)
self.onInputHandler.post("OnInput",data)
#if data == "\n":
# self.onInputHandler.post("OnInput",self.buffer)
# self.buffer=""
#else:
# self.buffer+=data
self.handler.post("GetInput")
def onClose(self):
#log.log(log.WARN,"Input: OnClose","Called")
self.toClose = True
sys.stdin.close()
最佳答案
在 os
模块有 os.read
允许较低级别控制从文件描述符读取的函数。只要至少有一个字节准备好读取,它就是非阻塞的。
os.read(fd, n)
Read at most n bytes from file descriptor fd. Return a string containing the bytes read. If the end of the file referred to by fd has been reached, an empty string is returned.
Availability: Unix, Windows.
Note: This function is intended for low-level I/O and must be applied to a file descriptor as returned by
os.open()
orpipe()
. To read a “file object” returned by the built-in functionopen()
or bypopen()
orfdopen()
, orsys.stdin
, use itsread()
orreadline()
methods.
关于Python sys.stdin.read(max) 阻塞直到读到max(如果max>=0),阻塞直到EOF else,但是select表示有数据要读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18937338/
对于一个简单的聊天程序,我使用了一个通过 boost::python 包装的 c 库。 使用 PyQT 编写了一个简单的 GUI。接收消息是通过阻塞调用完成的lib说。对于独立刷新的 GUI,通信部分
当我创建以下内容时,我试图创建一个可以被异常终止的线程类(因为我试图让线程等待一个事件): import sys class testThread(threading.Thread): def
我正在用 Haskell 编写服务器,我想在客户端断开连接后显式关闭它们。当我调用 hClose ,线程将阻塞,直到客户端关闭其一侧的句柄。有没有办法让它在不阻塞的情况下关闭? 提前致谢! 最佳答案
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: garbage collection Operation 我有几个相关问题。 1.JAVA垃圾收集器运行时,是否占用
我有一个 Angular 函数,它在初始 URL 中查找“列表”参数,如果找到,就会出去获取信息。否则我想获得地理位置。如果存在 URL 参数,我不想获取地理位置。我使用的术语是否正确? constr
我读了很多关于锁定数据库、表和行的文章,但我想要较低的锁定,比如只锁定“操作”,我不知道如何调用它,假设我在 php 中有函数: function update_table() { //que
在我的多线程 mfc 应用程序中,m_view->SetScrollPos 处于阻塞状态并且所有应用程序都被卡住。 View 是在另一个线程中创建的,这是这种行为的原因吗? //SetScrollPo
FreeSwitch 软件在几天内运行良好(~3 - 5 天),然后由于 FreeSwitch 被阻止,新的来电请求被接受!!正在进行的调用继续他们的 session ,他们的调用似乎没有受到影响,但
我有一组按钮,当鼠标悬停在这些按钮上时,它们会改变颜色。这些的 CSS 以这种方式运行: #navsite ul li button { height: 60px; width: 60
由于某些原因,当我调用 WSARecvFrom 时,该函数在接收到某些内容之前不会返回。 _socket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, N
我了解一些关于 Oracle 阻塞的知识——更新如何阻塞其他更新直到事务完成,写入者如何不阻塞读取者等。 我理解悲观和乐观锁定的概念,以及有关丢失更新等典型银行教科书示例。 我也理解 JDBC 事务隔
在两个代码点之间,我是否可以判断进程是否已被内核抢占,或者更确切地说,当时是否有任何其他代码在同一处理器上运行? //Point A some_type capture = some_capture(
这是我在 Oracle 的面试问题。 有一个堆栈,即使堆栈已满,push 操作也应该等到它完成,即使堆栈为空,pop 操作也应该等到它完成。 我们怎样才能做到这一点? 我的回答 让一个线程做push
我想知道是否有人可以告诉我如何有效地使用循环平铺/循环阻塞进行大型密集矩阵乘法。我正在用 1000x1000 矩阵做C = AB。我按照 Wikipedia 上的循环平铺示例进行操作,但使用平铺得到的
我正在阅读有关绿色线程的内容,并且能够理解这些线程是由 VM 或在运行时创建的,而不是由操作系统创建的,但我无法理解以下语句 When a green thread executes a blocki
我正在创建的 JavaScript API 具有以下结构: var engine = new Engine({ engineName: "TestEngine", engineHost
ChildWindow 是一个模态窗口,但它不会阻塞。有没有办法让它阻塞?我基本上想要一个 ShowDialog() 方法,该方法将调用 ChildWindow.Show() 但在用户关闭 Child
我需要一些关于如何调试 10.6 版本下的 Cocoa 并发问题的指导。我正在将“for”循环转换为使用 NSOperations,但大多数时候,代码只是在循环的某个时刻卡住。我可以在控制台中看到 N
我正在使用 ReportViewer 控件和自定义打印作业工作流程,这给我带来了一些问题。我的代码看起来有点像这样: ids.ForEach(delegate(Guid? guid)
我有以下成功复制文件的代码。但是,它有两个问题: progressBar.setValue() 之后的 System.out.println() 不会打印 0 到 100 之间的间隔(仅打印“0”直到
我是一名优秀的程序员,十分优秀!