问题标签 [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 投票
3 回答
3211 浏览

events - Postgres:发布语句(或插入)异步、非阻塞处理

我想知道是否有可能,在插入一组行之后,启动一个异步执行的操作,是非阻塞的,并且不需要通知请求的发起者 - 结果。

我正在处理大量事件,我可以保证插入后逻辑不会失败——我只想在我的事件源中有一个插入线程,我希望这个线程继续飞行而不会阻塞,并且不负责任何交付后的簿记。

我可以告诉你,我可能会有 100 个这样的作业同时执行,每个作业可能在 5 个表上运行,每个表上的插入次数在 200-1000 之间。

一个正确方向的提示就足够了。

0 投票
1 回答
173 浏览

.net - 用自定义的替换低级 Web 服务参考调用传输

我不确定标题听起来是否正确,所以我将在这里给出更多解释。我将从头开始:)

我正在使用 c# 和 .net 进行开发。

我有一个应用程序向一些肥皂网络服务发出请求,对于每个用户请求,它都会产生 3 到 10 个网络服务请求,它们都应该运行异步以一次性完成,所以我使用网络服务的异步方法生成参考,然后等待回调结果。但似乎它为我进行的每个异步调用启动一个线程(或从池中获取它),所以如果我有 10 个客户端,我必须生成 30 到 100 个线程,即使对于我的 16 核服务器来说听起来也很糟糕 :) 所以我想用我自己的替换低级传输实现,它使用非阻塞套接字,并且可以处理至少 50 个套接字在一个线程中并行运行而开销不大。但我实际上不知道把我的覆盖放在哪里最好。

我分析System.Web.Services.Protocols.SoapHttpClientProtocol了类,发现它有一些我实际上可以使用的 GetWebRequest 方法。如果我能以某种方式中断它创建的对象并从那里获取包含所有标头和正文的 http 请求,然后使用我自己的套接字发送它。

任何想法使用什么方法?或者也许我可以使用框架中内置的东西?

0 投票
1 回答
2147 浏览

asynchronous - Tornado 可以以非阻塞异步方式与 Cassandra 通信吗?

我正在开发一个 Web 项目,该项目必须处理如此多的客户请求。所以我正在考虑使用 Cassandra 和龙卷风。Tornado 似乎有一个内置客户端(tornado.httpclient.AsyncHTTPClient),它可以做 http 非阻塞请求。但是,Cassandra 使用 Thrift 协议。使用 Thrift,Tornado 似乎在向 Cassandra 查询时被阻止。

有没有人有经验?请建议我该怎么做。或者,是否有任何用于此目的的附加模块?

谢谢。

0 投票
2 回答
2797 浏览

python - Python:从线程子进程的标准输出进行非阻塞读取

我有一个脚本(worker.py),它以表单打印无缓冲的输出......

其中 n 是此脚本中的循环将进行的某个恒定迭代次数。在另一个脚本(service_controller.py)中,我启动了多个线程,每个线程都使用 subprocess.Popen(stdout=subprocess.PIPE, ...); 现在,在我的主线程 (service_controller.py) 中,我想读取每个线程的 worker.py 子进程的输出,并使用它来计算完成前剩余时间的估计值。

我拥有从 worker.py 读取标准输出并确定最后打印的数字的所有逻辑。问题是我无法弄清楚如何以非阻塞方式执行此操作。如果我读取一个恒定的 bufsize,那么每次读取最终都会等待来自每个工作人员的相同数据。我尝试了很多方法,包括使用 fcntl、select + os.read 等。我最好的选择是什么?如果需要,我可以发布我的来源,但我认为解释很好地描述了问题。

感谢您在这里的任何帮助。

编辑
添加示例代码

我有一个启动子流程的工人。

然后我有一个线程管理器。

和一些运行它的代码。

我已经删除了其他代码的日志,希望能找出问题所在。

0 投票
4 回答
2646 浏览

python - 如何使用 epoll 和 python 3.1 进行异步 http 请求

更新:在使用 Py3 进行了大量工作之后,包括编写我自己的异步 Web 服务器(在 Dave Beazley 的演示之后),我终于抛弃了 Python(以及我的一大堆代码)-:转而支持在NodeJS上运行的CoffeeScript。看看:GitHub(现在你可以在其中找到 95% 的有趣代码)、npm(对用户不友好的包管理器;很好摆脱,你从来没有辜负你的名字),一个疯狂的巨大的模块存储库(几乎 24/7 发布大量新内容),一个庞大而充满活力的社区,开箱即用的异步 HTTP 和文件处理......,所有这些(感谢V8占三分之一光速easy_install——有什么不喜欢的?阅读更多宣传:“脚本的未来”(幻灯片托管由SpreeWebdesign提供)。

有一个有趣的页面http://scotdoyle.com/python-epoll-howto.html关于如何在 python 3 中进行异步/非阻塞/AIO http服务。

有一个龙卷风网络服务器,它确实包括一个非阻塞的 http 客户端。我已经设法将服务器的某些部分移植到 python 3.1,但是客户端的实现需要pyCurl并且似乎有问题(一位参与者说 'Libcurl 是多么让人头疼',并看着令人难以置信的丑陋 pyCurl页面我怀疑 pyCurl 会很快到达 py3+)。

现在标准库中提供了 epoll,应该可以使用 python 开箱即用地执行异步 http 请求。我真的不想使用 asyncore 之类的;epoll 以作为该任务的理想工具而闻名,它是 python 发行版的一部分,因此使用除 epoll 之外的任何东西来实现非阻塞 http 是非常违反直觉的(如果你愿意,请证明我错了)。

哦,我觉得线程是可怕的。没有穿线。我使用无堆栈

对异步 http 主题进一步感兴趣的人不应错过peter portante 在 PyCon2010 上的演讲;同样令人感兴趣的是主题演讲,演讲者安东尼奥·罗德里格斯 (antonio rodriguez) 曾强调在标准库中拥有最新的 Web 技术库的重要性。

编辑可能有很多方法可以以很少的资源消耗实现高吞吐量。然而,不仅仅是我认为放弃线程(以及其他部分过时的方法);谷歌skipfish项目的人似乎也有类似的想法:他们说skipfish使用

多路复用单线程、完全异步的网络 I/O 和数据处理模型,消除了一些多线程客户端中存在的内存管理、调度和 IPC 低效率。

0 投票
3 回答
1583 浏览

c - 使用 Winsock 接收数据

现在,我正在为我的在线游戏编写网络程序,但我不确定如何接收数据。问题是我无法真正猜测数据包的大小,所以我想从数据包中仅读取 4 个字节并将它们转换为 int 以了解数据包的大小。然后我将创建一个该大小的缓冲区并接收数据包的其余部分,这是个好主意吗?

供您参考,我使用的是非阻塞 i/o。

0 投票
2 回答
1096 浏览

python - 关于在 python 中运行接收套接字时使用 jython 的问题

我对python和网络编程的了解不多。目前我正在尝试实现一个简单的应用程序,它可以接收用户发送的短信,从谷歌搜索 api 获取一些信息,并通过短信将结果返回给用户。此应用程序将继续收听用户的消息并立即回复。

如何获取用户发送的短信?这是来自中国移动供应商的名为飞信的程序。客户端飞信,就像一个即时通讯工具,可以发送/接收消息给其他使用手机接收/发送短信的人。

我正在使用一个模拟飞信程序的开源python程序。所以基本上我可以使用这个 python 程序与其他通过 SMS 使用手机的人交流。

我的核心程序是基于java的,所以我需要把这个python程序带入java环境。我正在使用 jython,现在我可以通过一些 java 代码行向用户发送消息。

但真正的问题是通过短信接收用户的过程。在 python 代码中,会创建一个新线程来持续监听用户。在 Python 中应该没问题,但是当我在 Jython 中运行类似的过程时,出现以下异常:

python代码中的第150行如下:

因为我对python不是很熟悉,尤其是socket部分,而且对Jython的使用也很陌生,我真的需要你的帮助或者只是建议或解释。

非常感谢!

0 投票
3 回答
1177 浏览

java - Java - 处理非阻塞调用

在我的应用程序中,我使用的是第三方 API。这是一种立即返回的非阻塞方法。我有一组元素,我必须在这些元素上调用此方法。

现在,我的问题是我必须找到一种方法,直到所有方法执行完成并进行下一个操作。我该如何处理?我无法修改第三方 API。

简而言之,它看起来像这样

0 投票
6 回答
907 浏览

multithreading - 当我有线程时,是否有非阻塞接收的用例?

我知道非阻塞接收在消息传递中的使用并不多,但仍然有一些直觉告诉我,它是必需的。以 GUI 事件驱动应用程序为例,您需要某种方式以非阻塞方式等待消息,以便您的程序可以执行一些计算。解决此问题的方法之一是使用带有消息队列的特殊线程。是否有一些用例,即使您有线程,您也确实需要非阻塞接收?

0 投票
3 回答
2528 浏览

sql-server - 如何让 SQL Server 事务使用记录级锁?

许多年前,我们有一个最初是作为桌面应用程序编写的应用程序。每当您打开编辑屏幕时,它都会启动一个事务,并在您单击确定时提交,或者在您单击取消时回滚。这对于桌面应用程序来说工作得很好,但现在我们正试图迁移到 ADO.NET 和 SQL Server,长时间运行的事务是有问题的。

我发现当多个用户都试图同时编辑(不同的子集)同一个表时,我们会遇到问题。在我们的旧数据库中,每个用户的事务都会为他们在事务期间修改的每条记录获取记录级锁;由于不同的用户正在编辑不同的记录,每个人都有自己的锁,一切正常。但是在 SQL Server 中,一旦一个用户在事务中编辑了一条记录,SQL Server 似乎就会锁定整个表。当第二个用户尝试编辑同一个表中的不同记录时,第二个用户的应用程序只是锁定,因为 SqlConnection 阻塞,直到第一个用户提交或回滚。

我知道长时间运行的事务是不好的,而且我知道最好的解决方案是更改这些屏幕,以便它们不再长时间保持事务打开。但由于这将意味着一些侵入性和风险的更改,我还想研究是否有办法让这些代码按原样启动和运行,以便我知道我的选择是什么。

如何在 SQL Server 中获取两个不同用户的事务来锁定单个记录而不是整个表?

这是一个快速而肮脏的控制台应用程序,说明了这个问题。我创建了一个名为“test1”的数据库,其中一个名为“Values”的表只有 ID (int) 和 Value (nvarchar) 列。如果您运行该应用程序,它会要求修改 ID、启动事务、修改该记录,然后让事务保持打开状态,直到您按 ENTER。我希望能够

  1. 启动程序并告诉它更新 ID 1;
  2. 让它得到它的交易并修改记录;
  3. 启动程序的第二个副本并告诉它更新 ID 2;
  4. 让它能够在第一个应用程序的事务仍然打开时更新(和提交)。

目前它在第 4 步冻结,直到我返回应用程序的第一个副本并关闭它或按 ENTER 以提交。对 command.ExecuteNonQuery 的调用会阻塞,直到第一个连接关闭。

以下是我已经尝试过的一些事情,但行为没有改变:

  • 将事务隔离级别更改为“未提交读取”
  • 在 UPDATE 语句中指定“WITH (ROWLOCK)”