我在windows上使用asyncio并引用了一个命名pipe道的传输对象:
class DatAPIpeHandler(asyncio.Protocol): def connection_made(self,trans): self.trans = trans # <<== this is a reference to a transport object of type _ProactorDuplexPipeTransport loop = asyncio.get_event_loop() server = loop.start_serving_pipe(lambda: DatAPIpeHandler(),r'\.pipetest-pipe')
现在我想使用self.trans来同步写入,然后从命名pipe道读取数据。 我怎样才能做到这一点?
它对我来说同样重要,因为这是一种RPC调用我正在使用pipe道(写东西,并迅速获得响应),我想要阻止偶循环的所有其他活动,直到这个“pipe道RPC调用“回报。 如果我不阻止事件循环的所有其他活动,直到这个RPC调用完成,我将有不需要的副作用,因为循环将继续处理其他我不想处理的事件。
我想要做的事(写入pipe道然后读取)与从事件中urllib2.urlopen(urllib2.Request('http://www.Google.com')).read()人非常相似循环线程 – 在这里,所有的事件循环活动都将被阻塞,直到我们从远程http服务器获得响应。
在windows上寻找轻量级PHP堆栈进行开发
ipithon笔记本无法正常工作
如何将std :: string值传递给C ++中的RegSetValueEx()
什么导致PHPlocking文件
有一个相当于LPTSTR的string吗?
我知道我可以调用self.trans.write(数据),但是这不会同步写入数据(据我所知它不会阻止)
谢谢。
编辑:在第一个评论之后,让我补充:
我知道我不应该阻止事件循环,我可以使用同步原语来完成我想要的。 但是让我们说你有事件循环,并行执行10个不同的活动,其中一个正在做某种RPC(如上所述),其他9个活动应该被阻塞,直到完成这个RPC。 所以我有两个select:
(1)像你所build议的那样向所有这10个活动添加同步原语(locking/信号量/条件)以便同步它们。
(2)通过阻塞写入然后阻塞读取/写入pipe道来实现这个RPC。 (假设我相信pipe道的另一端)
我知道这不是使用事件循环的常用方式,但在我的具体情况下,我认为(2)更好。 (更简单的逻辑)
用fileStream和file_FLAG_NO_BUFFERING读取文件
windows服务程序中的退出function的影响
C#不承认SafetokenHandle
远东语言文本不在windows Compact 7中绘制
在任务pipe理器的应用程序标签中设置应用程序
我认为你必须使用线程同步原语来确保整个循环(当前线程)被阻塞。 我认为最好的报价是使用线程队列和连接功能。
@Andrew svetlov
正如你所说, asyncio同步基元是正常的选择。
但是如何将事件循环协程打包并公开为同步函数API是我的问题。 我不希望API消费者处理asyncio概念
更新:找到了很酷的答案: 我如何在事件循环中打包协程作为正常的函数? 。
总结以上是内存溢出为你收集整理的如何执行asyncio传输对象的同步*读/写 *** 作全部内容,希望文章能够帮你解决如何执行asyncio传输对象的同步*读/写 *** 作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)