多进程工具包
项目描述
简单的多进程工具包。这是基于Gunicorn多进程引擎的。
这个库允许您监控多种类型的工人和链式管理员。优雅地处理、重载、工人之间的信号。
简单的仲裁器启动一个工人
from pistil.arbiter import Arbiter from pistil.worker import Worker class MyWorker(Worker): def handle(self): print "hello from worker n°%s" % self.pid if __name__ == "__main__": conf = {} specs = [(MyWorker, 30, "worker", {}, "test")] a = Arbiter(conf, specs) a.run()
与Pool仲裁器相同,这次我们在3个操作系统进程中发送相同的工人
from pistil.pool import PoolArbiter from pistil.worker import Worker class MyWorker(Worker): def handle(self): print "hello from worker n°%s" % self.pid if __name__ == "__main__": conf = {"num_workers": 3 } spec = (MyWorker, 30, "worker", {}, "test",) a = PoolArbiter(conf, spec) a.run()
这种模式的常见用途是tcp服务器之间共享相同的套接字。为此,pistil提供了TcpArbiter和TcpSyncWorker以及与gevent一起使用的GeventTcpWorker。
Pistil允许您在一个仲裁器中混合不同类型的工人
from pistil.arbiter import Arbiter from pistil.worker import Worker class MyWorker(Worker): def handle(self): print "hello worker 1 from %s" % self.name class MyWorker2(Worker): def handle(self): print "hello worker 2 from %s" % self.name if __name__ == '__main__': conf = {} specs = [ (MyWorker, 30, "worker", {}, "w1"), (MyWorker2, 30, "worker", {}, "w2"), (MyWorker2, 30, "kill", {}, "w3") ] # launchh the arbiter arbiter = Arbiter(conf, specs) arbiter.run()
您还可以链接仲裁器
import time import urllib2 from pistil.arbiter import Arbiter from pistil.worker import Worker from pistil.tcp.sync_worker import TcpSyncWorker from pistil.tcp.arbiter import TcpArbiter from http_parser.http import HttpStream from http_parser.reader import SocketReader class MyTcpWorker(TcpSyncWorker): def handle(self, sock, addr): p = HttpStream(SocketReader(sock)) path = p.path() data = "welcome wold" sock.send("".join(["HTTP/1.1 200 OK\r\n", "Content-Type: text/html\r\n", "Content-Length:" + str(len(data)) + "\r\n", "Connection: close\r\n\r\n", data])) class UrlWorker(Worker): def handle(self): f = urllib2.urlopen("http://localhost:5000") print f.read() class MyPoolArbiter(TcpArbiter): def on_init(self, conf): TcpArbiter.on_init(self, conf) # we return a spec return (MyTcpWorker, 30, "worker", {}, "http_welcome",) if __name__ == '__main__': conf = {"num_workers": 3, "address": ("127.0.0.1", 5000)} specs = [ (MyPoolArbiter, 30, "supervisor", {}, "tcp_pool"), (UrlWorker, 30, "worker", {}, "grabber") ] arbiter = Arbiter(conf, specs) arbiter.run()
此示例在端口5000上启动一个具有3个工作者的Web服务器,并启动另一个从该服务器获取欢迎页面的工人
$ python examples/multiworker2.py 2011-08-08 00:05:42 [13195] [DEBUG] Arbiter master booted on 13195 2011-08-08 00:05:42 [13196] [INFO] Booting grabber (worker) with pid: 13196 ici 2011-08-08 00:05:42 [13197] [INFO] Booting pool (supervisor) with pid: 13197 2011-08-08 00:05:42 [13197] [DEBUG] Arbiter pool booted on 13197 2011-08-08 00:05:42 [13197] [INFO] Listening at: http://127.0.0.1:5000 (13197) 2011-08-08 00:05:42 [13198] [INFO] Booting worker (worker) with pid: 13198 2011-08-08 00:05:42 [13199] [INFO] Booting worker (worker) with pid: 13199 welcome world welcome world
更多文档即将推出。请参阅examples/文件夹中的示例。
项目详情
关闭
pistil-0.2.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8a46d23c4762fff3a1de41f89905e9abfc14fd8bf70ae90cb64a1cd0c4cf69a3 |
|
MD5 | 0fab1474346c4b378447737b2e547d77 |
|
BLAKE2b-256 | 93583380d4e9ad48a4dca483884b074792c6a851f5f94b78935905fc7249e61c |