python使用gipc实现gevent的多进程及ipc通信

今天在和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实现数据的共享来的实在,再少都给你封装好了。 


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

  1. 奋战 2014年12月25日 / 上午7:28

    这东西的场景有些窄

发表评论

邮箱地址不会被公开。 必填项已用*标注