python下multiprocessing和gevent的组合使用

对于有些人来说Gevent和multiprocessing组合在一起使用算是个又高大上又奇葩的工作模式.

Python的多线程受制于GIL全局锁的特性,Gevent身为协程也是线程的一种,只是io调度上自己说了算而已。

那么如何使用多个cpu核心? 可以利用多进程mutliprocessing来进行多核并行工作,在多进程里面使用gevent协程框架可以更好的做io调度,相比线程来说减少了无谓的上下文切换.

废话少说,直接上个例子.  下面是多进程下生产者消费者的工作模式,代码本身很简单,自己跑一下就知道怎么一回事了.

# blog: xiaorui.cc

from multiprocessing import Process, cpu_count, Queue, JoinableQueue
from gevent import monkey; monkey.patch_all();
import gevent
import datetime
from Queue import Empty class Consumer(object):
def __init__(self, q, no_tasks, name):
self._no_tasks = no_tasks
self._queue = q
self.name = name
self._rungevent(self._queue, self._no_tasks) def _rungevent(self, q, no_tasks):
jobs = [gevent.spawn(self._printq) for x in xrange(no_tasks)]
gevent.joinall(jobs) def _printq(self):
while 1:
value = self._queue.get()
if value is None:
self._queue.task_done()
break
else:
print("{0} time: {1}, value: {2}".format(self.name, \
datetime.datetime.now(), value))
return class Producer(object):
def __init__(self, q, no_tasks, name, consumers_tasks):
print(name)
self._q = q
self._no_tasks = no_tasks
self.name = name
self.consumer_tasks = consumers_tasks
self._rungevent() def _rungevent(self):
jobs = [gevent.spawn(self.produce) for x in xrange(self._no_tasks)]
gevent.joinall(jobs)
for x in xrange(self.consumer_tasks):
self._q.put_nowait(None)
self._q.close() def produce(self):
for no in xrange(100):
print no
self._q.put(no, block=False)
return def main():
total_cores = cpu_count()
total_processes = total_cores * 2
q = JoinableQueue()
print("Gevent on top multiprocessing with 17 gevent coroutines 10 producers gevent and 7 consumers gevent")
producer_gevents = 10
consumer_gevents = 7
jobs = []
start = datetime.datetime.now()
for x in xrange(total_processes):
if not x % 2:
p = Process(target=Producer, args=(q, producer_gevents, "producer %d" % x, consumer_gevents))
p.start()
jobs.append(p)
else:
p = Process(target=Consumer, args=(q, consumer_gevents, "consumer %d" % x))
p.start()
jobs.append(p) for job in jobs:
job.join() print("{0} process with {1} producer gevents and {2} consumer gevents took{3}\
seconds to produce {4} numbers and consume".format(total_processes, \
producer_gevents * total_cores,
consumer_gevents * total_cores, \
datetime.datetime.now() - start,
producer_gevents * total_cores * 100)) if __name__ == '__main__':
main()

test

python下multiprocessing和gevent的组合使用的更多相关文章

  1. python3下multiprocessing、threading和gevent性能对比----暨进程池、线程池和协程池性能对比

    python3下multiprocessing.threading和gevent性能对比----暨进程池.线程池和协程池性能对比   标签: python3 / 线程池 / multiprocessi ...

  2. python 协程库gevent学习--gevent数据结构及实战(三)

    gevent学习系列第三章,前面两章分析了大量常用几个函数的源码以及实现原理.这一章重点偏向实战了,按照官方给出的gevent学习指南,我将依次分析官方给出的7个数据结构.以及给出几个相应使用他们的例 ...

  3. python中multiprocessing.pool函数介绍_正在拉磨_新浪博客

    python中multiprocessing.pool函数介绍_正在拉磨_新浪博客     python中multiprocessing.pool函数介绍    (2010-06-10 03:46:5 ...

  4. python的multiprocessing模块进程创建、资源回收-Process,Pool

    python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析. 1.方式一:fork( ...

  5. Python下划线简介

    Python中下划线的5种含义 分享一篇文章:The Meaning of Underscores in Python. 本文介绍了Python中单下划线和双下划线("dunder" ...

  6. python下划线的5种含义

    本文介绍了Python中单下划线和双下划线("dunder")的各种含义和命名约定,名称修饰(name mangling)的工作原理,以及它如何影响你自己的Python类. 单下划 ...

  7. python之multiprocessing创建进程

    python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. multiprocessing创建多进程在windows和linux系统下的 ...

  8. python并发编程之gevent协程(四)

    协程的含义就不再提,在py2和py3的早期版本中,python协程的主流实现方法是使用gevent模块.由于协程对于操作系统是无感知的,所以其切换需要程序员自己去完成. 系列文章 python并发编程 ...

  9. python 使用multiprocessing需要注意的问题

    我们在编写程序的时候经常喜欢这样写代码 import MySQLdb import time from multiprocessing import Process conn = MySQLdb.co ...

随机推荐

  1. HTML主体标签

    HTML标签 在HTML结构代码中可以看到非常多的<>,这就是html的标签.整块html代码几乎就是由各种各样的标签与标签内容构成,每一个标签对应一个网页上的一个小模块,如一段文字1,一 ...

  2. 理解serverless无服务

    理解serverless无服务 阅读目录 一:什么是serverless无服务? 二:与传统模式架构区别? 三:serverless优缺点? 四:使用serverless的应用场景有哪些? 回到顶部 ...

  3. 2019-ACM-ICPC-徐州站网络赛- I. query-二维偏序+树状数组

    2019-ACM-ICPC-徐州站网络赛- I. query-二维偏序+树状数组 [Problem Description] ​ 给你一个\([1,n]\)的排列,查询\([l,r]\)区间内有多少对 ...

  4. Oracle递归查询connect by

    一.概述 Oracle中可以通过START WITH . . . CONNECT BY . . .子句来实现SQL的层次查询. 自从Oracle 9i开始,可以通过 SYS_CONNECT_BY_PA ...

  5. Matplotlib模块的基本使用

    一.折线绘图 import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv("F:\\ml\\机器学习\\01 ...

  6. Hdu 4312-Meeting point-2——哈夫曼距离与切比雪夫距离

    题意 从 $n$ 个点中选择一点,使得其他点到其的切比雪夫距离最小($0 < n \leq 1e5$). 分析 定理:$(x_1, y_1)$ 与 $(x_2, y_2)$ 的曼哈顿距离等于 $ ...

  7. NodeJS事件环

    1. 执行顺序说明 1. 清空主执行栈 2. 清空微任务队列 3. 运行一个timer队列的回调函数,询问微任务队列,如果有回调函数,清空. 4. 循环第3步,直到清空timer队列 5. 进入pol ...

  8. vue+axios新手实践实现登陆

    vue+axios新手实践实现登陆 https://segmentfault.com/a/1190000015201803 增加 利用HTML5的history.replacestate()修改当前页 ...

  9. pandas记录

    pandas的map方法使用 import pandas as pd import numpy as np data = pd.DataFrame(np.random.randint(0, 10, ( ...

  10. visual studio2015窗体中控件的属性中文说明不见了

    右击属性窗口,然后选中好说明就ok了.