如何在Pool中使用Queue,Stack Overflow的回答,戳这里

其实吧官方文档看一遍应该就大部分都懂了。

需要注意的是:在使用多进程的时候,我们的进程函数的传入参数必须是pickle-able的,也就是参数必须可以被pickle保存下来,multiprocessing.Queue对象不能传递给pool.apply_*()等函数,需要使用multiprocessing.Manager().Queue()产生的对象

贴一下代码

# -*- coding: UTF-8 -*-
from multiprocessing import Process, Pool, Queue, Manager, JoinableQueue
import time
import os res = [] def put_task():
msg = []
for i in xrange(50):
time.sleep(0.1)
msg.append(str(os.getpid()))
return ','.join(msg) def collect_results(result):
res.append(result) def take_task(queue):
while 1:
print(queue.get(True)) def task_put(name, que):
for i in range(10):
time.sleep(1)
que.put("%d is done" % name) def task_take_queue(que, n):
i = 0
while i < n:
print(que.get(True))
i += 1 def consumer(input_q): while True:
item = input_q.get(True)
# 处理项目
print item # 此处替换为有用的工作
# 发出信号通知任务完成
input_q.task_done() def producer(output_q):
sequence = [1, 2, 3, 4] # range(5)[1:5]
for item in sequence:
# 将项目放入队列
time.sleep(1)
output_q.put(item)
# 建立进程 def method_1():
pool = Pool()
res = pool.map_async(put_task, range(5))
pool.close()
pool.join()
from pprint import pprint
pprint(res.get()) def method_2():
pool = Pool()
pool.apply_async(put_task, callback=collect_results)
pool.apply_async(put_task, callback=collect_results)
pool.apply_async(put_task, callback=collect_results)
pool.close()
pool.join()
from pprint import pprint
pprint(res) def method_3():
pool = Pool(processes=10)
m = Manager()
q = m.Queue()
for i in range(5):
pool.apply_async(task_put, (i, q))
pool.apply_async(task_take_queue, (q, 50))
pool.close()
pool.join() def method_4():
q = JoinableQueue() # 运行使用者进程
cons_p = Process(target=consumer, args=(q,))
cons_p.daemon = True # 定义该进程为后台运行 True - When a process exits, it attempts to terminate all of its daemonic child processes.
cons_p.start()
# 生产项目,sequence代表要发送给使用者的项目序列
# 在时间中,这可能是生成器的输出或通过一些其他方式生产出来 producer(q)
# 等待所有项目被处理
q.join() if __name__ == '__main__':
method_4()
 import multiprocessing
import os
import time def pool_init(q):
global queue # make queue global in workers
queue = q def task():
# can use `queue` here if you like
for i in range(5):
time.sleep(1)
queue.put(os.getpid()) def take_task():
while 1:
print(queue.get(True)) def run(pool):
tasks = []
tasks.append(pool.apply_async(take_task))
for i in range(os.cpu_count()):
tasks.append(pool.apply_async(task))
for t in tasks:
print(t.get(), ) if __name__ == '__main__':
queue = multiprocessing.Queue()
pool = multiprocessing.Pool(initializer=pool_init, initargs=(queue,))
run(pool)
pool.close()
pool.join()

 

python multiprocessing 使用的更多相关文章

  1. python multiprocessing example

    python multiprocessing example Server Code: #!/usr/bin/python #-*- coding: UTF-8 -*- # mpserver.py # ...

  2. python MultiProcessing模块进程间通信的解惑与回顾

    这段时间沉迷MultiProcessing模块不能自拔,没办法,python的基础不太熟,因此就是在不断地遇到问题解决问题.之前学习asyncio模块学的一知半解,后来想起MultiProcessin ...

  3. python multiprocessing模块

    python multiprocessing模块 原文地址 multiprocessing multiprocessing支持子进程.通信和共享数据.执行不同形式的同步,提供了Process.Queu ...

  4. python multiprocessing.Process

    在使用Kafka-python时自己写的一个bug 我在一个进程的__init__中初始化了一个producer,但是一直不好用 但是在函数里直接new一个就好用了 why? 需要说明的是produc ...

  5. python MultiProcessing标准库使用Queue通信的注意要点

    今天原本想研究下MultiProcessing标准库下的进程间通信,根据 MultiProcessing官网 给的提示,有两种方法能够来实现进程间的通信,分别是pipe和queue.因为看queue顺 ...

  6. Python multiprocessing

     推荐教程 官方文档 multiprocess各个模块较详细介绍 廖雪峰教程--推荐 Pool中apply, apply_async的区别联系 (推荐)python多进程的理解 multiproce ...

  7. python multiprocessing深度解析

    在写python多线程代码的时候,会用到multiprocessing这个包,这篇文章总结了一些这个包在多进程管理方面的一些原理和代码分析. 1. 问题一:是否需要显式调用pool的close和joi ...

  8. Python multiprocessing模块的Pool类来代表进程池对象

    #-*-coding:utf-8-*- '''multiprocessing模块提供了一个Pool类来代表进程池对象 1.Pool可以提供指定数量的进程供用户调用,默认大小是CPU的核心数: 2.当有 ...

  9. python Multiprocessing 多进程应用

    在运维工作中,经常要处理大量数据,或者要跑一些时间比较长的任务,可能都需要用到多进程,不管是管理端下发任务,还是客户端执行任务,如果服务器配置还可以,跑多进程还是挺能解决问题的 Multiproces ...

  10. python multiprocessing.Pool 中map、map_async、apply、apply_async的区别

    multiprocessing是python的多进程库,multiprocessing.dummy则是多线程的版本,使用都一样. 其中都有pool池的概念,进程池/线程池有共同的方法,其中方法对比如下 ...

随机推荐

  1. jquery序列化from表单使用ajax提交返回json数据(使用struts2注解result type = json)

    1.action类引入struts2的"json-default"拦截器栈 @ParentPackage("json-default") //示例 @Paren ...

  2. Oracle时间的加减

    最近三个月:  select add_months(sysdate,-3)) from dual; 最近90天:   select  to_char(sysdate-90,'yyyy-MM-dd') ...

  3. MySQL数据库的回滚失败(JAVA)

    这几天在学习MySQL数据的知识,有一个小测试,用来测试数据库的提交和回滚. 刚开始的时候真的没把这个当回事,按照正常的步骤来讲的话,如下所示,加载驱动,获取数据库的连接,并且把数据库的自动提交给关闭 ...

  4. 让AutoMapper在你的项目里飞一会儿

    先说说DTO DTO是个什么东东? DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已. 为什么要用DTO? 1.DTO更注重数据,对领域对 ...

  5. MVC 导出Execl 的总结几种方式 (三)

    第三种方式呢,就是借用第三方插件 NPOI 来实现Execl 导出 第一步:在NuGut包中下载NPOI 组件 第二步:编辑控制器代码 public FileResult ExcelNewKeyPro ...

  6. 用struct模块解决tcp的粘包问题

    服务器端程序 import struct import socket sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() conn ...

  7. BZOJ4144: [AMPPZ2014]Petrol(最短路 最小生成树)

    题意 题目链接 Sol 做的时候忘记写题解了 可以参考这位大爷 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...

  8. js dictionary字典 遍历

    var dic={A:"AA",B:"BB",C:"CC"} //不能length去for循环(length:undefined) dic[ ...

  9. 爬虫必备—Scrapy

    一.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 ...

  10. CSS 画一个八卦

    效果图: 实现原理: 设置高度为宽度的2倍的一个框,利用 border 补全另一半的宽度,设置圆角 用两个 div 设置不同的颜色,定位到圆的上下指定位置. 最后只剩下里面的小圆圈了.设个宽高,圆角即 ...