我怎样才能进行异步编程但是在Python中隐藏它?

时间:2015-05-12 08:05:09

标签: python multithreading asynchronous

只是让我的头围绕扭曲,穿线,无堆叠等等,并会欣赏一些高级别的建议。

假设我有远程客户端1和2,通过浏览器页面中运行的websocket连接。这是理想的目标:

for cl in (1,2):
    guess[cl] = show(cl, choice("Pick a number:", range(1,11)))
checkpoint()
if guess[1] == guess[2]:
    show((1,2), display("You picked the same number!"))

忽略showchoicedisplay的机制,重点是我希望show调用是异步的。每个客户都会看到选择。代码在checkpoint()等待所有线程(或其他)重新加入。

即使它们涉及重写源代码等毛茸茸的东西,我也会对听到答案感兴趣。我也对不那么多毛茸茸的答案感兴趣,这些答案涉及在语法上有所妥协。

2 个答案:

答案 0 :(得分:1)

代码最简单的解决方案是使用支持远程procdure调用(RPC)的Autobahn这样的框架。这意味着您可以在浏览器中调用一些JavaScript并等待结果。

如果要调用两个客户端,则必须使用线程。

您也可以手动执行此操作。该方法的工作原理如下:

  • 您需要将回调传递给show()
  • show()需要在全局dict
  • 中使用某种字符串ID注册回调
  • show()必须将此ID发送给客户
  • 当客户端发送答案时,它必须包含ID。
  • 然后,Python处理程序可以从全局dict中删除回调并使用答案调用它
  • 回调需要收集结果。
  • 如果结果足够(在您的情况下为两个),则必须向客户端发送状态更新。

您可以使用yield简化代码,但理解背后的理论有点复杂:What does the "yield" keyword do in Python?coroutines

答案 1 :(得分:0)

在Python中,最广泛使用的基于异步/事件的网络编程方法可能会将该模型隐藏在程序员手中gevent

注意:这种技巧通过使任务产生控制来隐式地起作用,这会鼓励在涉及OS线程时出现的相同类型的令人惊讶的错误。关于这些问题的局部推理比明显屈服更难,并且避免回调的便利性可能不值得固有pitfalls引入的麻烦。对于像你这样的图书馆作者来说也许同样重要:这种方法不是纯粹的Python,会强迫你对图书馆用户的依赖和解释器限制。

当Guido正在研究当时被称为郁金香的asyncio图书馆时,很多关于这个话题的讨论都在萌芽(特别是在gevent和扭曲的阵营之间)。他总结了主要问题here