胸骨多处理

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行情>

    我想用一种方法来编程,不要太多。

安装

pypi

$ pip install zproc

麻省理工学院许可证
巨蟒3.5+

文档

文档状态

阅读文档

示例

愿望列表

以下是我希望在zproc中实现的一些想法,但目前没有实现。

  • 冗余状态服务器—自动选择/回退。
  • 绿色,erlang风格的进程。(需要cpython内部组件)
  • 进程链接,自动在进程间传播错误。
  • 使命名空间水平可扩展。

功能

  • 过程管理

    • 记得在退出时清除进程,对于gen艾莱依和平。(即使它们是嵌套的)
    • 记录使用zproc创建的进程。
    [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是过程的缩写。


欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java本机方法的源代码可用吗?   java如何使父方法抛出异常?   java Android以编程方式设置不同屏幕大小/密度的布局   java如何使用一个变量来管理所有客户端请求   java输入一个txt文件,每行有一组数字   json java从jsonobject获取jsonarray错误   java将一个(WAV)写入一个文件只会说一个单词(最后一个单词)   java Telnet忽略原始字节   proguard java。运行桌面应用程序时出现lang.VerifyError   java用左键移动JLabel?   java如何在jText区域验证选项卡?   文件服务器客户端Javasocket编程中的字符串搜索   java省略了JSTL中的最后一个逗号<c:out>   java如何找到if或else代码已执行的次数?   java JavaScript WebSocket send()方法未执行   浮点数声明上的java标识符预期错误   java这是指二进制搜索算法吗?   编译mod at:reobfJar java时的minecraft问题。util。拉链ZipException:重复条目   java检测特定的震动运动(如图所示:D)