胸骨多处理
zproc的Python项目详细描述
zproc是一个思想实验,它使多任务处理变得更容易,并且每个人都可以访问。
它专注于为pythonistas自动化与消息传递系统相关的各种任务。 最终目标是使python成为执行多任务的一流语言。
所以你不必考虑神秘的细节, 像请求-应答循环、可靠的发布-订阅、工作管理、任务分配、异常传播之类的…
看,zproc的力量:
importzproc## define "atomic" operations#@zproc.atomicdefeat_cookie(snapshot):snapshot["cookies"]-=1print("nom nom nom")@zproc.atomicdefbake_cookie(snapshot):snapshot["cookies"]+=1print("Here's a cookie!")## specify a process#defcookie_eater(ctx):state=ctx.create_state({'ready':True})# `start_time=0` accesses events from the very beginning.for_instate.get_when_change("cookies",start_time=0,count=5):eat_cookie(state)# boilerplatectx=zproc.Context(wait=True)state=ctx.create_state({"cookies":0})# create a "ready" handleready=state.get_when_available("ready")# spwan the processproc=ctx.spawn(cookie_eater)print(proc)# wait for readynext(ready)# finally, bake some cookies.for_inrange(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食者提供异步事件处理。
核心理念
消息传递很麻烦,容易出错,而且是tedius-- 因为涉及到很多手动布线。
这个项目背后的想法是在消息传递领域中广泛接受的模型上提供pythonic api。
一开始是拥抱共享状态(但不是共享内存)。
几乎每个人都不喜欢共享内存,因为内存本身就是哑的。 记忆并不真的在乎是谁在给它写信。
共享状态会带来自身的风险,因为很难跟踪变化。
借助演员模型,zproc的状态可以跟踪谁在做什么。 因此,它可以充当时间机器,从任何定义的时间向您提供状态事件。
然后,它演变为跨流程处理异常、故障转移、工人群、事件源, 以及其他非常有用的功能,可实现多任务。
底层架构100%基于消息传递, 因此可以在许多计算机上扩展, 只需对用户代码进行最少的修改。
为什么不就X呢?
每种技术解决方案都有它的位置。下面是使用zproc over x的原因的简要说明。
x==异步
有点名不副实。asyncio严格用于基于i/o的并发。 事实上,这意味着重构的极端程度。引用Joe Armstrong的话,
< Buff行情>我想用一种方法来编程,不要太多。
安装
$ pip install zproc
麻省理工学院许可证
巨蟒3.5+
文档
愿望列表
以下是我希望在zproc中实现的一些想法,但目前没有实现。
- 冗余状态服务器—自动选择/回退。
- 绿色,erlang风格的进程。(需要cpython内部组件)
- 进程链接,自动在进程间传播错误。
- 使命名空间水平可扩展。
功能
过程管理
[ZProc] Cleaning up 'python' (13652)...
工人/流程图
通信顺序进程,处于核心位置。
确定性状态更新。
- 提供一个不依赖于不稳定的酒吧/酒吧的事件消息系统。
- 回到过去,用一个计时机器!
默认情况下是分布式的。
- 可扩展到多台计算机,只需最少的重构。
原子操作
详细、人性化的过程错误记录。
[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
注意事项
- 只有在最高级别执行时,状态才会更新。
这意味着,如果你在Dict Hirearchy的深处对物体进行变异, 它们不会反映在全球状态中。 - 状态应该是可腌制的。
- 它运行一个额外的进程来管理状态。
不过,它们相当轻,不应该添加太多 对你的申请很重要。
FAQ
- <>快?
- 最重要的是,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
示波器
谢谢
- 感谢开放式徽标提供了美妙的zproc徽标。
- 感谢Pieter Hintjens, 对于他在ZeroMQ库上的工作 对于他那本了不起的书来说。
- 感谢tblib, zproc可以从zproc服务器引发一级异常!
- 感谢psutil, zproc可以处理嵌套进程!
- 多亏了肯尼思·里茨。 他的setup.py用于在pypi上主持此项目。 加上大量的文档结构被公然复制 从他关于请求的文档中
zproc是零过程的缩写。