跳转到主要内容

gaspar eventlet zmq 并行工作进程

项目描述

Gaspar是一个用于创建小型、简单的TCP守护进程的库,它通过简单的低开销请求/响应模式并行化CPU密集型工作。

它是通过启动多个工作进程,使用eventlet处理传入请求,以及使用0MQ推送/拉取消息模式在进程间负载平衡工作并接收响应来实现的。

运行中的服务器

Gaspar使用“生产者”和“消费者”术语来指代接收传入请求和实际处理这些请求的进程。在0MQ文档中,这些被称作“通风器”和“排水槽”,并在分布式系统文献中使用了各种其他术语。要使用Gaspar,您只需创建一个生产者和一个消费者,然后启动生产者

>>> import gaspar
>>> def echo(message): return message
>>> consumer = gaspar.Consumer(handler=echo)
>>> producer = gaspar.Producer(consumer, 10123)
>>> producer.start()

“启动”调用将阻塞,此时您将有一个服务器,该服务器正在监听端口10123,接收请求,将它们发送到多个工作进程(默认为您的机器上的CPU数量),然后根据回声处理程序进行回复。

请求

Gaspar的默认生产者接收简单裸TCP端口的请求。这些请求是

  • 一个4字节无符号整数,以网络字节序排列(struct.pack('!I', N)

  • 长度为该长度的字符串

回复只是一个字符串,后面跟着套接字的终止。方便函数 gaspar.client.request("host:port", message) 会同步发送请求并返回回复。它使用基本的 socket 库,因此你可以使用 eventlet 或 gevent 的 monkey patching 方法安全地进行“绿色”处理。

gaspar.client 还提供了一个名为 pack 的函数,它接受一个字符串并返回一个新字符串,其中包含前缀的 4 个字节消息长度。如果你在使用不基于 greenlet 的异步框架的 gaspar 守护进程,可以使用此函数来处理客户端协议的这方面。

局限性

无格式请求/响应

Gaspar 请求和响应只是字符串。没有标准的方式来序列化多个参数或返回多个值。由于分配给这种守护进程的工作可能会因为错误的调用语义而被破坏,因此这些细节留给了 Consumer 实现,以及客户端响应的后处理。

单服务器操作

尽管所使用的技术(TCP 和 0MQ)允许守护进程跨系统分散,但这不是 Gaspar 的原始设计目标,目前也不受支持。

为什么我不应该使用 celery?

Gaspar 与 Celery 相比的主要“优势”在于其小巧的体积、概念上的简单性和无基础设施的运行。Gaspar 的目的是使从紧密的事件驱动 I/O 循环(如 eventlet、gevent、tornado 等)中删除 CPU 密集型进程变得非常容易,将其转换为 I/O 等待,并将该工作分散到多个核心。

Celery 旨在服务于更广泛的用途,功能更为复杂,并具有 Gaspar 缺乏的延迟和周期性执行等功能。如果你需要异步执行多个不同的任务,Celery 非常擅长此任务。如果你有一个异步工作进程,它有几个非常 CPU 密集型的任务会阻塞事件循环,Gaspar 允许你用很少的代码将这些工作分配给守护进程。

支持者:

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