我正在寻找Ruby中的一个方法,基本上是这样的:
io.ready_for_read?
Run Code Online (Sandbox Code Playgroud)
我只想检查一个给定的IO对象(在我的情况下,是一个popen调用的结果)是否有可用的输出,即后续调用io.read(1)不会阻塞.
这是我看到的两个选项,我都不喜欢:
io.read_nonblock- 太简单的Unix抽象read()- 我不想处理errno错误处理.
io.select 超时0 - 模糊了这个简单操作的目的.
是否有一个我忽略的更好的选择?
我在php和python中有两个网站.当用户向服务器发送请求时,我需要php/python将HTTP POST请求发送到远程服务器.我想立即回复用户而不等待远程服务器的响应.
是否可以在向用户发送响应后继续运行php/python脚本.在这种情况下,我将首先回复用户,然后才将HTTP POST请求发送到远程服务器.
是否有可能在php/python中创建一个非阻塞的HTTP客户端而根本不处理响应?
在php和python中具有相同逻辑的解决方案对我来说是优选的.
谢谢
我正在研究一个套接字监听器,它必须在2个端口上侦听2种类型的数据(端口80和端口81).这些数据与对数据执行的操作类型非常相似,只是因为它们到达不同的端口而不同.我继续使用Java的ServerSocket类编写实现,但后来才意识到ServerSocket类的accept()方法是块,我的实现无法承受.所以现在我正在考虑使用Java NIO实现相同的功能,但在完成了一些教程之后,我认为我比我开始时更困惑.如果这里的某个人可以引导我完成整个过程,即使它是伪代码或技术"下一步该做什么",那将是很棒的.这就是我打算实现的目标.
通过调用2个类似的线程来监听,就像永远在2个端口上一样.(非阻塞)来自某个网络位置的远程设备连接,发送数据然后断开连接.
我想如果只知道如何使用NIO设置服务器来监听端口,那么就可以实现localhost上的端口80,其余的都很容易实现.
干杯
我们的分析服务器是用c ++编写的.它基本上查询底层存储引擎,并通过thrift返回相当大的结构化数据.典型的请求大约需要0.05到0.6秒才能完成,具体取决于请求大小.
我注意到我们可以在c ++代码中使用哪些Thrift服务器,特别是TNonblockingServer,TThreadedServer和TThreadPoolServer.看起来像TNonblockingServer是要走的路,因为它可以支持更多的并发请求,并且仍然使用场景后面的线程池来完成任务.它还避免了构造/破坏线程的成本.
Facebook关于节俭的更新:http://www.facebook.com/note.php? note_id = 16787213919
在Facebook,我们正在为C++开发一个完全异步的客户端和服务器.此服务器使用事件驱动的I/O,如当前的TNonblockingServer,但它与应用程序代码的接口都基于异步回调.这将允许我们编写服务器,只需几个线程即可服务数千个同时发出的请求(每个请求都需要调用其他Thrift或Memcache服务器).
stackover上的相关帖子:节俭中的大量同时连接
话虽这么说,你不一定能够更快地完成工作(处理程序仍在线程池中执行),但更多的客户端将能够立即连接到你.
只是想知道我在这里还有其他因素吗?我该如何确定哪一个最适合我的需求?
为了避免javascript阻止网页呈现,我们不能只是简单地在结束</body>标记之前加载/执行所有的JS文件/代码吗?
只有在呈现所有页面之后才会下载和执行所有JS文件和代码,因此需要像本文中建议的那样加载JS文件的非阻塞技术.他基本上建议使用如下代码:
document.getElementsByTagName("head")[0].appendChild(script);
为了在渲染网页的同时推迟脚本,从而导致网页的快速渲染速度.
但是,如果不使用这种类型的非阻塞技术(或其他类似技术),我们不会通过简单地将所有JS文件(要加载/执行)放在结束</body>标记之前来实现相同的非阻塞结果吗?
我更惊讶,因为作者(在同一篇文章中)建议将他的代码放在结束</body>标记之前(参见文章的"脚本放置"部分),所以他基本上是在结束</body>标记之前加载脚本.他的代码需要什么呢?
我很困惑,任何帮助表示感谢,谢谢!
UPDATE
仅供参考,Google Analytics正在使用类似的非阻止技术来加载其跟踪代码:
<script type="text/javascript">
...
(function()
{
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = 'your-script-name-here.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s); //why do they insert it before the 1st script instead of appending to body/head could be the hint for another question.
})();
</script>
</head>
Run Code Online (Sandbox Code Playgroud) 有没有办法fork()在Perl中实现非阻塞/异步执行(没有'ing)?
我曾经是一名Python开发人员多年...... Python拥有非常棒的'Twisted'框架允许这样做(使用DEFERREDs.当我运行搜索以查看Perl中是否有任何内容可以执行相同操作时,我遇到了POE框架 - 看起来与我正在搜索的内容"相近".但是......花了一些时间阅读文档并"玩"代码后,我反对"墙" - 这是限制性的(来自POE) ::会话文档):
回调不是先发制人的.只要一个人正在运行,就不会派遣其他人.这称为协作式多任务处理.每个会话必须通过返回中央调度内核进行协作.
这种限制基本上违背了异步/并行/非阻塞执行的目的 - 通过限制在任何给定时刻执行的只有一个回调(代码块).当另一个回调已经在运行时,没有其他回调可以开始运行!
所以......在Perl中有没有办法实现多任务(并行,非阻塞,异步执行代码)而不用fork()- 类似于Python中的DEFERREDs?
我在文件系统库中看到了很多同步函数.如fs.readFileSync(filename, [options]).
如果节点具有异步/非阻塞IO并且没有睡眠方法,那么如何(以及为什么)实现这些功能 - 我可以使用相同的机制来实现其他同步功能吗?
我正在玩gevent,我试图理解为什么我的代码阻塞以及我如何解决它.
我有一个greenlets池,每个都与一个thrift客户端交谈,它从远程thrift服务器收集数据.出于练习的目的,thrift服务器总是采用> 1秒来返回任何数据.当我生成greenlets并运行join时,它们并不是全部并行执行,而是一个接一个地执行.我的理解是,这种情况正在发生,因为我的代码是"阻塞",因为当我运行时monkey.patch_all(),所有的greenlets都会神奇地并行运行.
那么我如何使代码非阻塞自己而不是猴子修补一切而不理解它在做什么?
这里有一个我不明白的例子:
import time
from gevent.pool import Pool
def hello():
print 'Hello %d' % time.time()
time.sleep(1)
def main():
pool = Pool(5)
for _ in xrange(5):
pool.spawn(hello)
pool.join()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
产量
Hello 1345477112
Hello 1345477113
Hello 1345477114
Hello 1345477115
Hello 1345477116
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用gevent.sleep,但如何使用常规time.sleep使该功能无阻塞?
谢谢
我看过一些select()与poll()or相比的文章epoll(),我看到很多指南讨论了select()多个套接字的实际用法.
但是,我似乎无法找到的是与没有阻塞的无阻塞recv()呼叫的比较select().如果只有1个套接字要读取,1个套接字要写入,是否有任何理由使用该select()呼叫?该recv()方法可以设置为WSAEWOULDBLOCK在没有可用数据的情况下不阻塞并返回错误(),那么select()当您没有其他套接字要检查时,为什么还要打扰?非阻塞recv()调用是否慢得多?
nonblocking ×10
asynchronous ×2
blocking ×2
io ×2
java ×2
python ×2
sockets ×2
c ×1
c++ ×1
concurrency ×1
gevent ×1
javascript ×1
node.js ×1
perl ×1
php ×1
posix-select ×1
recv ×1
ruby ×1
threadpool ×1
thrift ×1