类似于Erlang的'接收'在Python中的阻塞构造

时间:2017-09-07 07:15:37

标签: python python-3.x erlang

我正在用Python编写应用程序并希望在没有任何状态变量的情况下编写它(排除属性和驻留在函数外部的任何其他变量)。

类比:从我的Erlang经验中我知道,Erlang有一个整洁的演员模型,作为其中的一部分,它可以阻止'接收'结构。据我所知,这是gen_server的基本机制,它允许将状态存储为参数,而不是外部变量。 Python中有这样的东西吗?还是我走错了路?

具体问题:在Python中是否有办法允许我存储状态(在我的情况下是DB连接句柄)而不使用驻留在函数外部的任何变量?我可以使用可能需要的任何积极维护的框架来实现这一点。

1 个答案:

答案 0 :(得分:0)

我认为你所寻找的是如何以功能性方式编写Python的指针,尽可能避免使用全局状态,特别是能够使其成为“反应性”的东西。就像Erlang本来就是这样。

通常可以避免Python中的全局状态吗?是的,在大多数情况下。有些事情只是全球化,因为它们代表了现实世界的资源,而且你不会逃避这一点(但是使用队列来顺序化通信的是什么)。当然,这并不意味着你必须有两个并发线程写入同一个套接字。但是,它确实意味着您可以生成线程或者在没有对全局状态有太多可见性的情况下分叉进程,并以内部开发自己状态的方式编写它们(这是正常的事情)。

是否有可能使Python在"被动"有点像?当然。有一些"反应" Python的框架,许多编码器(包括我自己)发现,当用函数式limited (or no) use of the class keyword编写时,Python是最易维护和可理解的。将两者放在一起,你可能会有点接近你的目标。我从未使用它,但ReactiveX for Python似乎是朝这个方向发展的。在这里也有一个答案,可能会给你一些思考的食物。

可行吗?是。但是可取的?这完全取决于您尝试解决的实际问题,而您尚未表达。这很容易就意味着这是一个X-Y问题,你需要先解决X才能以理智的方式前进。

谨防那些不适合某种语言的范例。我个人并不认为Python的优势在于这个领域,我也没有发现Python(缺乏)错误恢复策略有助于并发网络编程。在并发编程壁橱中有许多大而可怕的怪物,而共享数据只是其中之一 - 调度,访问,资源控制,队列溢出管理,排序,顺序瓶颈等等都将在后面他们的头在某个时刻。

有一个原因 Python有一个GIL,并且有一个原因,人们在大多数单线程语言(如Python)中发现大规模并发的最佳解决方案是使用OS线程结合Docker之类的东西来强制任意系统分区,采用某种恢复方法,并将调度和资源管理推迟到底层主机操作系统(即使这些影响在很大程度上是无意识的成就。 Docker社区)。

这些都是超级难题,你不想在你开发的每个项目中都要为这些超级难题编写解决方案。

事实证明,Erlang运行时已经提供了所有这些,因为这些是它旨在解决的确切问题。这里的差异比OOP与FP 编码范例更深刻,并且真正触及the underlying runtime and resource management paradigm(在正常情况下,这种性质的讨论在某种程度上神秘地省略了)。如果需要反应性,大规模并发是你的问题,我建议你的项目使用Erlang - 但是对于在Python中更好表达的部分,可能使用Python(特别是如果已经有Python库可以做任何繁重的工作)