今天在和FK聊天的时候,聊到了利用gevent的多进程模式,我和他交流了下,我的用法,其实模仿了php-fpm的进程模式,就是fork进程,然后开辟一个队列,这个队列是放链接的对象,然后每个进程里面也有一个gevent pool池另外还附带一个队列 。 main Thred的队列是用来存放用户请求的链接对象,子进程的队列是根据gevent pool的数量定制的队列。
爬虫真牛逼,这里标记下gevent多进程的原文地址,xiaorui.cc
FK推荐了用 gipc ,这名字就很有含义,gevent + ipc的缩写。为什么要命名为gipc那? gevent 身为协程的架构,他们直接自己就可以通信呀。 因为gipc是多进程的通信,gipc他简单的实现了gevent的多进程,他的通信也比较的简单,就是pipe,管道。
gipc和一般的pipe一样,都是支持duplex双工参数。算是个小应用吧,个人觉得,gipc实现多进程的效率不见得有多高,也就图个方便吧。
gipc生成子进程很简单,就直接start_process就可以了。
gipc.start_process(target=child_process, args=(r, ))
下面是一个既有子进程,又可以互相通信的例子,需要大家先 pip install gipc
#xiaorui.cc import gevent import time import gipc def main(): with gipc.pipe() as (r, w): p = gipc.start_process(target=child_process, args=(r, )) p = gipc.start_process(target=random_process) wg = gevent.spawn(writegreenlet, w) try: p.join() except KeyboardInterrupt: wg.kill(block=True) p.terminate() p.join() def writegreenlet(writer): num = 0 while True: num += 1 writer.put(num) gevent.sleep(1) def child_process(reader): while True: print "Child process got message from pipe:\n\t'%s'" % reader.get() def random_process(): while True: time.sleep(1) print 'random' if __name__ == "__main__": main()
IPC管道模式的通信,用来做两个进程之间的通信,也就是说,顶多就两个进程互相玩,你非要搞成n个客户端也是可以的,但是调度又tm是问题。 另外咱们今天说的gipc又不支持多个客户端,还不如用multiprocessing的manager实现数据的共享来的实在,再少都给你封装好了。
这东西的场景有些窄