问题标签 [nonblocking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1650 浏览

c# - 测试非阻塞队列

我已将此处的非阻塞队列伪代码移植到 C#。下面的代码是论文的近逐字副本。

您将采用什么方法来测试实施?

注意:我在 VS2010 中运行,所以我还没有 CHESS 支持。

编辑:

我已经删除了有问题的代码,所以一些毫无戒心的开发人员不会使用它——它需要进行相当多的更改才能让它没有错误……我仍然不能 100% 确信它没有错误。通过蛮力测试,我无法让它比基于锁的解决方案执行得更好。

此外,由于我的目标是 3.5,所以我认为我是 SOL 与 4.0 并发队列。3.5 RX 框架包括一个 ConcurrentQueue,所以这确实只是一个有趣的小编程练习,仅此而已。

0 投票
2 回答
918 浏览

ruby - Ruby Win32Api 获得单字符非阻塞

我正在尝试编写一个使用两个线程的简单游戏,一个线程用于获取用户的输入,另一个线程用于为某些场景设置动画。我可以在不按 ENTER 的情况下获得字符,但它会在动画线程中阻塞,直到用户按下一个键。有谁知道从键盘非阻塞获取字符的方法?

0 投票
4 回答
10161 浏览

c# - 非阻塞 TCP 服务器

这真的不是一个问题,我只是在寻找一些指导方针:) 我目前正在编写一些抽象的 tcp 服务器,它应该尽可能少地使用线程。

目前它以这种方式工作。我有一个正在监听的线程和一些工作线程。侦听器线程只是坐下来等待客户端连接我希望每个服务器实例都有一个侦听器线程。工作线程正在客户端套接字上执行所有读/写/处理工作。

所以我的问题是建立高效的工作流程。我遇到了一些我还不能真正解决的问题。工人代码是这样的(代码真的很简单,只是为了显示我遇到问题的地方):

由于while循环再次循环,它可以顺利接受100%的CPU利用率,如果我让我的客户执行send->receive->disconnect例程,那并不是那么痛苦,但是如果我尝试保持活力,则执行send->接收->发送->重新接收,它真的吃光了所有的 CPU。所以我的第一个想法是在那里休眠,我检查是否所有套接字都发送了数据,然后将 Thread.Sleep 放入 POINT2 仅 10 毫秒,但是这 10 毫秒后会在我想接收下一个时产生 10 毫秒的巨大延迟来自客户端套接字的命令..例如,如果我不尝试“保持活动”命令正在 10-15 毫秒内执行,并且保持活动状态至少 10 毫秒会变得更糟:(

也许这只是一个糟糕的架构?可以做些什么来使我的处理器无法获得 100% 的利用率,并且我的服务器无法尽快对客户端套接字中出现的内容做出反应?也许有人可以指出一个很好的例子来说明它应该维护的非阻塞服务器和架构?

0 投票
2 回答
4981 浏览

linux - 为什么非阻塞 TCP connect() 在 Linux 上偶尔会这么慢?

我试图测量我正在编写的 TCP 服务器的速度,我注意到测量 connect() 调用的速度可能存在一个基本问题:如果我以非阻塞方式连接,则连接() 操作在几秒钟后变得非常缓慢。以下是 Python 中的示例代码:

使用NonBlockingConnect,大多数 connect() 操作都很快,但每隔几秒就会有一个 connect() 操作至少需要 2 秒(如P输出中的 5 个连续字母所示)。通过使用sock.connect而不是NonBlockingConnect所有连接操作似乎很快。

怎样才能摆脱这些缓慢的连接()?

我正在使用标准 PAE 内核运行 Ubuntu Karmic 桌面:

奇怪的是没有延迟strace -f ./conn.py

奇怪的是,如果我取消注释非常快没有延迟time.sleep

奇怪的是我的 Ubuntu Hardy 系统没有延迟:

所有这些系统都会受到影响(运行 Ubuntu Karmic、Ubuntu Hardy、Debian Etch):

奇怪的是以下 Debian Lenny 系统不受影响:

仅供参考如果我使用 AF_UNIX 套接字没有延迟。

仅供参考,如果我在 C 中实现客户端,我会得到相同的行为:

0 投票
2 回答
1016 浏览

c++ - 检查 fgets 是否会阻塞

我只是想知道在 C 中是否可以窥视输入缓冲区或执行类似的技巧来了解对 fgets 的调用是否会在以后阻塞。Java 允许通过调用 BufferedReader.ready() 来执行类似的操作,这样我可以实现控制台输入,如下所示:

这允许外部线程通过设置为 false 来优雅地关闭输入循环;我想在 C 中执行类似的实现而不使用不可移植的技巧,我已经知道我可以在 unix 下通过使用信号或(更好,即使需要处理缓冲)重新实现来制作“超时 fgets”它在recv/select之上,但我更喜欢在windows上也能工作的东西。

TIA

0 投票
3 回答
6650 浏览

python - 执行非阻塞请求?- 姜戈

最近我一直在玩其他框架,比如 NodeJS。

我喜欢返回响应的可能性,并且仍然能够进行进一步的操作。

例如


也许 Django 已经提供了一种在返回请求后执行操作的方法,如果是这样的话,那就太好了。


非常感谢您的帮助!=D

0 投票
1 回答
112 浏览

file - 是否有一种 posix 方式来确保按顺序刷新两个文件而不会阻塞?

在我的程序中,我打开了两个文件以供写入,一个包含数据块的内容文件和一个包含迄今为止已写入数据块的映射的索引文件。

我想将它们都刷新到磁盘上,尽可能提高性能,唯一的限制是数据文件中的块必须在映射文件中的相应块之前写入(自然)。

问题是,出于延迟和吞吐量原因,我想避免阻止 IE 执行 fsync。

有任何想法吗?

0 投票
3 回答
3811 浏览

c++ - 异步事件循环设计和问题

我正在使用 epoll/devpoll/kqueue/poll/select(包括 windows-select)为异步套接字 IO 设计事件循环。

我有两个执行选项,IO 操作:

非阻塞模式,在 EAGAIN 上轮询

  1. 将套接字设置为非阻塞模式。
  2. 读/写到套接字。
  3. 如果操作成功,则将完成通知发布到事件循环。
  4. 如果我得到 EAGAIN,请将套接字添加到“选择列表”并轮询套接字。

轮询方式:轮询后执行

  1. 将套接字添加到选择列表并轮询它。
  2. 等待通知它可读可写
  3. 读/写
  4. 将完成通知发布到成功的事件循环

在我看来,在正常模式下使用时首先需要更少的系统调用,尤其是写入套接字(缓冲区非常大)。此外,看起来有可能减少“选择”执行次数的开销,特别是当您没有像 epoll/devpoll/kqueue 那样可扩展的东西时,这很好。

问题:

  • 第二种方法有什么优点吗?
  • 在众多操作系统上对套接字/文件描述符进行非阻塞操作是否存在任何可移植性问题:Linux、FreeBSD、Solaris、MacOSX、Windows。

注意:请不要建议使用现有的 event-loop/socket-api 实现

0 投票
4 回答
19020 浏览

.net - 是否有 MessageBox.Show 的非阻塞版本(或类似的版本)?

久违的更新

我接受 MUG4N 对这个问题的回答,我也想回应一些针对它提出的批评。

ChrisF 说:

...您不能直接从后台线程进行 UI 调用。

这是一个笼统的陈述,并非 100% 正确。让我指出几个事实:

  1. 如果您设置Control.CheckForIllegalCrossThreadCalls = false. “啊!” 我听到你说。永远不要那样做!” 是的,是的——但为什么呢?答案:因为有时这会破坏内存。

    中的控制类System.Windows.Forms未编写为线程安全的,因此有时从后台线程更新它们可能会损坏内存。但是,如果这种情况只是偶尔发生而不总是发生,那么这告诉我的不是 UI 代码本身的调用,而是可能导致异常的 UI 代码的潜在不安全冲突

  2. 为了强化第 1 点,考虑一下:从后台线程调用 UI 代码的“安全”方式是使用Control.Invokeor Control.BeginInvoke,对吗?但这一个 UI 调用;如果我们从非 GUI 线程更新 GUI,这只是我们应该进行的UI 调用。我的意思是,很明显,它不仅仅是Control从外部线程调用对象的“任何”方法,这会导致混乱(如果是这种情况,那么我们甚至无法调用Invoke,我们会完全陷入困境) . 同样,不能安全地同时发生的单独 UI 调用的潜在冲突将证明是破坏性的。

  3. 牢记以上两点,问问自己:为什么MessageBox.Show从非 GUI 线程调用会不安全?一个完全独立Form的被创建和显示;它的属性不以任何方式与任何其他现有的 GUI 对象交互;事实上,它不能以任何方式在任何地方访问,除了一种:从调用线程访问它的属性(并且只能通过方法的返回值)。DialogResultShow

一起前进。康拉德·阿尔布雷希特说:

...鉴于 Show() 在 Dan 的 ref'd 主题中设置了自己的消息泵的断言,(这没有得到证实,但我无法反驳)...

这是一个完全公平的观点(尽管我个人对 Jared Par 有足够的尊重,以至于我通常不会怀疑他所说的话)。无论如何,通过ReflectorMessageBox.Show查看该方法会发现以下代码段:

对该方法的进一步了解Application.BeginModalMessageLoop揭示了这一点:

而这ThreadContext.FromCurrent,反过来:

我对这些较低级别的 Windows 构造了解得不够多,无法完全理解这段代码,但在我看来,这似乎证明了 Jared 在我在旧评论中引用的答案中所说的话(对于好奇的读者:Does MessageBox. Show() 自动编组到 UI 线程?)。

是的。在这一点上,我完全同意 MUG4N。

(如果有人可以令人信服地争辩说我在这里仍然是错误的,请说出来。虽然我觉得我已经为为什么我认为 MUG4N 是正确的做了一个很好的理由,但我显然不是 100% 确定的。)


原始问题

通常你只是想通知用户发生了一些事情,但实际上不需要他们的任何输入。在这种常见情况下,我有时会看到如下代码:

众所周知,这段代码会导致出现一个只有一个确定按钮的小弹出窗口。现在事情是这样的:这段代码块(UI 线程)。但在我看来,在绝大多数情况下,如果您只有一个确定按钮,则几乎不需要阻止。(阻塞的目的通常不是为了接收用户的一些输入吗?如果用户的唯一选择是“OK”,在这种典型情况下,阻塞不是毫无意义吗?)

显然,我可以编写我自己的小表单,它基本上完全MessageBox.Show可以做,除了它什么都不返回(no DialogResult)并且不阻塞。但我只是想知道这样的事情是否已经存在而我不知道。

0 投票
1 回答
335 浏览

java - 在 Java 中,访问 RandomAccessFile 时从 FileChannel 获取 FileLock 的保证方法是什么?

我正在尝试使用

FileChannelobject 根据 javadoc 它可以抛出OverlappingFileLockException. 当我创建一个具有 2 个线程的测试程序时,锁定方法似乎正在等待获取锁定(独占和非独占)但是当实际场景中线程数增加时,超过重叠文件锁定异常被抛出并且处理速度减慢由于块在文件锁定表。

获得锁避免 OverlappingFileLockException 的最佳方法是什么?