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.ccimport geventimport timeimport gipcdef 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实现数据的共享来的实在,再少都给你封装好了。

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

相关文章:

你感兴趣的文章:

标签云: