ZProc - 多进程强化
项目描述
ZProc是一个思想实验,旨在使多任务处理更容易,更易于每个人使用。
它专注于自动化与消息传递系统相关的各种任务,为Python开发者提供便利。最终目标是使Python成为多任务处理的一流语言。
这样,你就不必担心像请求-回复循环、可靠的发布-订阅、工作管理、任务分配、异常传播等晦涩的细节...
来看看ZProc的力量吧!
import zproc
#
# define "atomic" operations
#
@zproc.atomic
def eat_cookie(snapshot):
snapshot["cookies"] -= 1
print("nom nom nom")
@zproc.atomic
def bake_cookie(snapshot):
snapshot["cookies"] += 1
print("Here's a cookie!")
#
# specify a process
#
def cookie_eater(ctx):
state = ctx.create_state({'ready': True})
# `start_time=0` accesses events from the very beginning.
for _ in state.get_when_change("cookies", start_time=0, count=5):
eat_cookie(state)
# boilerplate
ctx = zproc.Context(wait=True)
state = ctx.create_state({"cookies": 0})
# create a "ready" handle
ready = state.get_when_available("ready")
# spwan the process
proc = ctx.spawn(cookie_eater)
print(proc)
# wait for ready
next(ready)
# finally, bake some cookies.
for _ in range(5):
bake_cookie(state)
结果
Process - pid: 10815 target: '__main__.cookie_eater' ppid: 10802 is_alive: True exitcode: None
Here's a cookie!
Here's a cookie!
nom nom nom
Here's a cookie!
nom nom nom
Here's a cookie!
nom nom nom
Here's a cookie!
nom nom nom
nom nom nom
该框架为你处理消息传递。
state.get_when_change()
迭代器异步地向cookie_eater
进程提供事件,随着状态的更新而更新。
核心思想
消息传递很繁琐、易出错、很费时——因为涉及到大量的手动连接。
本项目背后的理念是提供一个Pythonic API,用于广泛接受的消息传递领域的模型。
它最初是通过对共享状态(但不是共享内存)进行拥抱而开始的。
由于内存本身是愚蠢的,几乎每个人都对共享内存持否定态度,因为它不关心谁在写入它。
共享状态也带来了自己的危险,因为很难跟踪变化。
在Actor模型的帮助下,ZProc的状态记录了谁在做什么。如此之多,以至于它可以充当时间机器,并从任何定义的时间点提供状态事件。
然后它进一步发展到处理跨进程的异常、故障转移、工作群、事件溯源以及其他与多任务处理相关的非常实用的功能。
底层架构100%基于消息传递,因此可以跨多台计算机进行扩展,而无需对用户代码进行最小修改。
为什么不直接使用X呢?
每种技术解决方案都有其适用场景。以下是为什么您会选择使用ZProc而不是X的原因概述。
-
X == asyncio
从名字中就能看出。Asyncio专门用于基于I/O的并发。而且它还暗示了极端的重构。引用Joe Armstrong的话:
我想有一种编程计算机的方法,而不是很多。
安装
$ pip install zproc
MIT许可证
Python 3.5+
文档
愿望清单
以下是一些我希望在ZProc中实现但尚未实现的想法。
- 冗余状态服务器 -- 自动选择/回退。
- 绿色,Erlang风格的进程。(需要Cpython内部接口)
- 进程链接,自动在进程间传播错误。
- 使命名空间水平可扩展。
功能
-
🌠 进程管理
- 退出时记住清理进程,以便总体上保持平静。(即使是嵌套的)
- 记录使用ZProc创建的进程。
- 🔖
[ZProc] Cleaning up 'python' (13652)...
-
🌠 工作进程/进程映射
- 自动管理工作进程,并将任务委托给它们。
- 🔖
-
🌠 通信顺序进程是核心。
-
确定性的状态更新。
- 附带一个不依赖于故障PUB/SUB的事件消息系统。
- 使用
TimeMachine
回到过去!
-
默认情况下是分布式的。
- 可扩展到多台计算机,且重构最小。
-
🌠 原子操作
- 执行任意数量的操作作为单个原子操作对状态进行操作。
- 🔖
-
🌠 详细、人性化的进程错误日志。
[ZProc] Crash report: target: '__main__.p1' pid: 8959 ppid: 8944 Traceback (most recent call last): File "/home/dev/Projects/zproc/zproc/child.py", line 88, in main **self.target_kwargs File "/home/dev/Projects/zproc/zproc/child.py", line 65, in target_wrapper return self.target(*args, **kwargs) File "test.py", line 12, in p1 raise ValueError ValueError
注意事项
- 只有在最高级别进行时,状态才会更新。
这意味着如果您在字典层次结构中深处修改对象,它们将不会反映在全局状态中。 - 状态应该是可序列化的。
- 它运行额外的进程来管理状态。
尽管它们相当轻量,但不应给您的应用程序增加太多负担。
常见问题解答
-
快吗?
- 首先,ZProc是为安全性和易用性而编写的。
- 然而,由于它使用ZMQ编写,对于大多数事情来说足够快。
-
稳定吗?
- 大部分。然而,由于它仍在开发阶段,您应该预料到一些API更改。
-
可用于生产吗?
- 请现在不要在生产中使用它。
-
兼容Windows吗?
- 可能吧?
本地开发
# get the code
git clone https://github.com/pycampers/zproc.git
# install dependencies
cd zproc
pipenv install
pipenv install -d
# activate virtualenv
pipenv shell
# install zproc, and run tests
pip install -e .
pytest
构建文档
cd docs
./build.sh
# open docs
google-chrome _build/index.html
# start a build loop
./build.sh loop
ZProc在野外
感谢
- 感谢open logos提供美好的ZProc标志。
- 感谢pieter hintjens,他为ZeroMQ库的工作,以及他的令人惊叹的书籍。
- 感谢tblib,ZProc可以从zproc服务器抛出第一类异常!
- 感谢psutil,ZProc可以处理嵌套进程!
- 感谢Kennith Rietz。他的setup.py用于在pypi上托管此项目。此外,大量的文档结构明显借鉴了他的requests文档。
ZProc是零进程的缩写。
项目详情
下载文件
下载适用于您的平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。