多进程工具包
项目描述
简单的多进程工具包。这是基于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("https://: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 |