微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何执行asyncio传输对象的同步*读/写操作

我在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概念

更新:找到了很酷的答案: 我如何在事件循环中打包协程作为正常的函数? 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐