跳转到主要内容

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的话:

    我想有一种编程计算机的方法,而不是很多。

安装

PyPI

$ pip install zproc

MIT许可证
Python 3.5+

文档

Documentation Status

阅读文档

示例

愿望清单

以下是一些我希望在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是零进程的缩写。


🐍🏕️

项目详情


下载文件

下载适用于您的平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

zproc-0.9.5.tar.gz (28.2 kB 查看哈希值)

上传时间

构建分发

zproc-0.9.5-py2.py3-none-any.whl (35.0 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面