根据java api,InputStream.read()描述为:
如果由于到达流末尾而没有可用字节,则返回值-1.此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常.
我有一个while(true)循环执行读取,当通过流发送任何内容时,我总是得到-1.这是预期的.
我的问题是什么时候会读取()阻止?因为如果它没有获得任何数据,则返回-1.我希望阻塞读取等到收到数据.如果你已经到达输入流的末尾,不应该读取()只是等待数据而不是返回-1?
或者read()只阻止是否有另一个线程访问流并且你的read()无法访问流?
这引出了我的下一个问题.我曾经有过事件监听器(由我的库提供),当数据可用时会通知我.当我收到通知时,我会调用while((aByte = read()) > -1)存储字节.当我在非常接近的时间内收到两个事件并且我的所有数据都没有被显示时,我感到很困惑.似乎只显示第二个事件数据的尾端,其余部分丢失了.
我最终改变了我的代码,以便当我得到一个事件时,我会调用if(inputStream.available() > 0) while((aByte = read()) > -1)存储字节.现在它正常工作,我的所有数据都显示出来了.
有人可以解释这种行为吗?该InputStream.available()是说要回,你可以阻止下一个调用方之前读取的字节数(流?).即使我不使用.available(),我希望第一个事件的读取只是阻止第二个事件的读取,但不会擦除或消耗过多的流数据.为什么这样做会导致我的所有数据都不显示?
我正在尝试学习nodejs和我正在工作的一个小项目正在编写一个API来控制一些联网的LED灯.
控制LED的微处理器具有处理延迟,我需要将发送到微处理器的命令间隔至少100ms.在C#中,我习惯只调用Thread.Sleep(时间),但我没有在节点中找到类似的功能.
我在节点中使用setTimeout(...)函数找到了几个解决方案,但是,这是异步的并且不会阻塞线程(这是我在这种情况下所需要的).
有人知道阻塞睡眠或延迟功能吗?最好是不仅能旋转CPU,而且精度为+ -10 ms的东西?
曾几何时我碰到了Indy的介绍文章,从那时起就不能停止考虑阻塞与非阻塞IO.
寻找一些好文章,描述阻止IO和非阻塞IO的优缺点,以及如何在每种情况下设计应用程序,以获得自然,易于理解和易于维护的代码.
想了解大图...
类似的问题:
我有一个对象,我希望向库客户端(特别是脚本客户端)公开一个方法,如:
interface MyNiceInterface
{
public Baz doSomethingAndBlock(Foo fooArg, Bar barArg);
public Future<Baz> doSomething(Foo fooArg, Bar barArg);
// doSomethingAndBlock is the straightforward way;
// doSomething has more control but deals with
// a Future and that might be too much hassle for
// scripting clients
}
Run Code Online (Sandbox Code Playgroud)
但我可用的原始"东西"是一组事件驱动的类:
interface BazComputationSink
{
public void onBazResult(Baz result);
}
class ImplementingThing
{
public void doSomethingAsync(Foo fooArg, Bar barArg, BazComputationSink sink);
}
Run Code Online (Sandbox Code Playgroud)
其中,ImplementingThing接受输入,做一些神秘的事情,如在任务队列上排队,然后在结果发生时,sink.onBazResult()在一个线程上调用,该线程可能与调用ImplementingThing.doSomethingAsync()的线程相同或不同.
有没有一种方法可以使用我拥有的事件驱动函数以及并发原语来实现MyNiceInterface,以便脚本客户端可以愉快地等待阻塞线程?
编辑:我可以使用FutureTask吗?
我正在使用Firebug 1.5.2,在生产发布之前测试一个站点时,我可以看到"阻塞"部分请求消耗了大量时间.
"阻止"究竟是什么意思?
我正在使用WAMP在本地计算机(Windows 7 Ultimate x64)上开发一个站点,运行APACHE v2.2.22,PHP 5.3.13和MySQL v5.5.24.我正在使用Chrome v 22.0.1229.94进行开发.不过,我在网站上有相当多的javascript,Chrome正在无情地阻止javascript在页面上运行.
点击地址栏中的"此页面上被阻止的javascript"图标,其中包含已选中"始终允许在本地主机上使用Javascript"的下拉列表,我在Chrome的设置中也有一个JavaScript例外,明确表示始终允许在"http"上使用JavaScript :// localhost"的.
允许使用Cookie,"允许所有网站运行JavaScript"已被检查,我不知道为什么Chrome不允许JavaScript运行.
总的来说,由于IE9和Firefox 16.1都允许JavaScript而我可以利用它们,因此我找到一个修复项目并不是必须的.我只是好奇我是否可以采取任何措施来解决这个问题,因为我希望继续在Chrome中进行开发.
来自node.js的观点,其中所有代码都是非阻塞的.
在Go中,使用通道可以轻松实现非阻塞.
如果有人在go中编写node.js类型的服务器,是否有意义使其无阻塞?例如,让数据库connect()函数返回一个通道,而不是在等待连接发生时阻塞.
对我来说,这似乎是正确的方法
但......
我正在用python测试子进程管道.我知道我可以直接在python中执行下面的程序,但这不是重点.我只是想测试管道,所以我知道如何使用它.
我的系统是Linux Ubuntu 9.04,默认为python 2.6.
我从这个文档示例开始.
from subprocess import Popen, PIPE
p1 = Popen(["grep", "-v", "not"], stdout=PIPE)
p2 = Popen(["cut", "-c", "1-10"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
print output
Run Code Online (Sandbox Code Playgroud)
这样的作品,但由于p1的stdin不被重定向,我在终端类型的东西喂管.当我输入^D关闭stdin时,我得到了我想要的输出.
但是,我想使用python字符串变量将数据发送到管道.首先我尝试写stdin:
p1 = Popen(["grep", "-v", "not"], stdin=PIPE, stdout=PIPE)
p2 = Popen(["cut", "-c", "1-10"], stdin=p1.stdout, stdout=PIPE)
p1.stdin.write('test\n')
output = p2.communicate()[0] # blocks forever here
Run Code Online (Sandbox Code Playgroud)
没工作.我尝试p2.stdout.read()在最后一行使用,但它也阻止.我补充说p1.stdin.flush(),p1.stdin.close()但它也没有用.我然后我开始沟通:
p1 = Popen(["grep", "-v", "not"], stdin=PIPE, stdout=PIPE)
p2 = Popen(["cut", "-c", "1-10"], …Run Code Online (Sandbox Code Playgroud) 我接受了MUG4N对这个问题的回答,我也想回应一些针对它提出的批评.
克里斯夫说:
...您无法直接从后台线程进行UI调用.
这是一个一揽子声明,并非100%正确.我只想指出一些事实:
实际上,你可以使UI呼吁所有你想要的,如果你设置Control.CheckForIllegalCrossThreadCalls = false."确认!" 我听你说."不要永远做!" 是的,是的 - 但为什么呢?答案:因为有时这会破坏记忆.
中的控件类System.Windows.Forms不是编写为线程安全的,因此有时从后台线程更新它们可能会破坏内存.但是,如果这种情况有时只发生而且并非总是如此,那么这告诉我的不是UI代码本身的调用,而是可能导致异常的UI代码的潜在不安全冲突.
为了强调第1点,请考虑以下事项:从后台线程调用UI代码的"安全"方法是使用Control.Invokeor Control.BeginInvoke,对吗?但这是一个UI调用 ; 如果我们从非GUI线程更新GUI,那只是我们应该进行的 UI调用.我的意思是,显然,它不是简单地Control从外部线程调用对象的"任何"方法,这将导致混乱(如果是这种情况,那么我们甚至无法调用Invoke,我们将被完全卡住) .同样,它是单独的UI调用的潜在冲突,它们不能同时安全地发生,这将证明具有破坏性.
牢记以上两点,请问自己:为什么MessageBox.Show从非GUI线程调用会不安全?Form创建并显示完全独立的内容; 它的属性不以任何方式与任何其他现有GUI对象交互; 事实上,它不能以任何方式在任何地方访问,除了一个:来自调用线程,它访问其属性(并且只通过方法的返回值).DialogResultShow
继续前进.康拉德·阿尔布雷希特说:
...鉴于断言Show()在Dan的ref'd主题中设置了自己的消息泵,(这没有证实,但我不能反驳)......
这是一个完全公平的观点(尽管我个人非常尊重贾里德帕尔,我通常不会怀疑他说的是什么).无论如何,MessageBox.Show通过Reflector查看方法会显示以下片段:
Application.BeginModalMessageLoop();
try
{
result …Run Code Online (Sandbox Code Playgroud) blocking ×10
java ×2
javascript ×2
node.js ×2
nonblocking ×2
.net ×1
asynchronous ×1
concurrency ×1
events ×1
firebug ×1
firefox ×1
go ×1
html ×1
image ×1
inputstream ×1
io ×1
ipc ×1
java-io ×1
messagebox ×1
pipe ×1
python ×1
rxtx ×1
sleep ×1
subprocess ×1
timedelay ×1
video ×1
winforms ×1