多线程调用函数,获取其返回值,个人总结了三种方法:

一、Queue(进程队列)

构造方法:multiprocessing.Queue([maxsize])

  Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。

常用方法:

  1. q.size()    返回队列中信息大概数量,有时候可能不太准确。
  2. empty()   检测队列是否为空,空返回True,否则返回false。
  3. full()        检测队列是否存满,满返回Ture,否则返回false。
  4. put(obj[, block[, timeout]])    put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为True。如果队列当前为空且block为False,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为Flase,put方法将引发Full异常。
  5. put_nowait()  等同于put(obj,False)
  6. get([block[, timeout]])    移除并返回队列中一个信息。

    block为True(default)、timeout为None(default),有信息立刻返回,否则进程将进入拥塞状态,直到获取到一个信息。

    block为True(default)、设置timeout时间,有信息立刻返回,否则进程将进入拥塞状态,timeout时间过后,无信息产生Queue.Empty异常。

block为false,有信息立刻返回,无信息立刻产生Queue.Empty异常。

7. get_nowait()  等同于get(False)

Python Queue模块有三种队列及构造函数:

  • Python Queue模块的FIFO队列先进先出。 class Queue.Queue(maxsize)
  • LIFO类似于堆,即先进后出。 class Queue.LifoQueue(maxsize)
  • 还有一种是优先级队列级别越低越先出来。 class Queue.PriorityQueue(maxsize)

队列可存储多个数据,数据按照存取顺序依次获取。如果队列已为空,再次使用get()函数,主进程将进入等待状态。

from multiprocessing import Process,Queue

def multiply(a,b,que):                          #add a argument to function for assigning a queue
que.put(a * b) #putting return value into queue
que.put(a * (b - 1)) #putting return value into queue if __name__ == '__main__':
queue1 = Queue() #create a queue object
p = Process(target = multiply,args = (4,5,queue1)) #setting 3rd argument to queue1
p.start()
p.join()
print(queue1.get()) #getting return value: 20
print(queue1.get()) #getting return value: 16
print('OK')

  

运行结果:

20
16
OK

  

二、manager对象

Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装。使用multiprocessing.Manager可以简单地使用这些高级接口。
Manager()返回的manager对象控制了一个server进程,此进程包含的python对象可以被其他的进程通过proxies来访问。从而达到多进程间数据通信且安全。
Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。

import multiprocessing

def worker(procnum, return_dict):
'''worker function'''
print str(procnum) + ' represent!'
return_dict[procnum] = procnum if __name__ == '__main__':
manager = multiprocessing.Manager()
return_dict = manager.dict()
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,return_dict))
jobs.append(p)
p.start() for proc in jobs:
proc.join()
print return_dict.values()

运行结果:

0 represent!
1 represent!
2 represent!
3 represent!
4 represent!
[0, 1, 2, 3, 4]

三、map

import multiprocessing
from os import getpid def worker(procnum):
print 'I am number %d in process %d' % (procnum, getpid())
return getpid() if __name__ == '__main__':
pool = multiprocessing.Pool(processes = 3)
print pool.map(worker, range(5))

运行结果:

I am number 0 in process 8108
I am number 1 in process 8108
I am number 2 in process 8108
I am number 3 in process 8108
I am number 4 in process 8108
[8108, 8108, 8108, 8108, 8108]

四、Pipes(通道)

构造方法:multiprocessing.Pipe([duplex])

  duplex默认情况下为True,表示通道是双向的;为False,表示通道是单向的。

返回值:(conn1, conn2)

  返回一对连接对象,代表一个通道的两端。conn1只能用于接收信息,conn2只能用于发送信息。

from multiprocessing import Process, Pipe

def f(conn):
conn.send([42, None, 'hello'])
conn.close() if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print parent_conn.recv() # prints "[42, None, 'hello']"
p.join()

运行结果:

[42, None, 'hello']

Pipe成对出现,一个发送信息,一个接受信息。

注意:两个以上进程或者线程同一时间读、写信息,将破坏管道中的信息。  

  

  

  

  

  

  

  

python 多进程间交换信息与共享信息的更多相关文章

  1. 【python】-- 多进程的基本语法 、进程间数据交互与共享、进程锁和进程池的使用

    多进程 进程之间是相互独立的,python是启动进程的时候,是启动的是原生进程.进程是没有GIL锁的,而且不存在锁的概念,进程之间的数据式不能共享的,而线程是可以的. 1.进程的定义 用mulipro ...

  2. [b0035] python 归纳 (二十)_多进程数据共享和同步_共享内存Value & Array

    1. Code # -*- coding: utf-8 -*- """ 多进程 数据共享 共享变量 Value,Array 逻辑: 2个进程,对同一份数据,一个做加法,一 ...

  3. Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...

  4. python 进程间共享数据 (二)

    Python中进程间共享数据,除了基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

  5. python 进程间共享数据 (一)

    def worker(num, mystr, arr): num.value *= 2 mystr.value = "ok" for i in range(len(arr)): a ...

  6. Win7系统与它的Virtualbox中安装的Ubuntu14.04共享信息的几种方法

    虚拟机是每一个程序猿必备的工具.本文依据最新版VirtualBox用户手冊的提示,通过自己的亲自实践,给出了Win7系统与执行在当中的VirtualBox 5.0.2中的Ubuntu 14.04共享信 ...

  7. python——5行代码采集3000+上市公司信息

    毕业季也到了找工作的季节了,很多小伙伴都会一家一家的公司去看,这得多浪费时间啊.今天用Python教大家怎么采集公司的信息,相信大家会很喜欢这个教程的,nice! 基本环境配置 版本:Python3 ...

  8. Python中获取异常(Exception)信息

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...

  9. 使用python爬取MedSci上的期刊信息

    使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...

随机推荐

  1. MySQL(十)之视图

    前言 前面给大家介绍了查询语句,感觉写的还不错的,喜欢的可以去查看.今天给大家分享的是MySQL中的视图. 视图(View):视图是由查询结果形成一张虚拟的表.非临时表,只要不删除的话就会一直存放在磁 ...

  2. android-学习1 配置环境

    转载注明出处,谢谢--http://www.cnblogs.com/JK-HYJ/ 前提:电脑先配置好java的环境-- adk_bundle下载安装地址:http://tools.android-s ...

  3. 定宽块状元素居中 1记(text-align/margin:0 auto)

    对于text-align:center的用法只是针对文本相对于父元素的居中,例如: #jz2{ width:300px; margin: 10px auto; border:2px solid red ...

  4. JAVA基础第七组(5道题)

    31.题目:将一个数组逆序输出.              1.程序分析:用第一个与最后一个交换. package com.niit.homework1; /** * @author: Annie * ...

  5. 团队作业8----第二次项目冲刺(beta阶段)5.20

    Day2--5.20 1.每日讨论 会议内容:1.新成员乔桦和周迪慢慢了解项目. 2.组内负责主要编程的益靖对代码进行了大概的说明. 3.对昨天的工作进行了几点总结. 4.组长对每个成员的任务完成了分 ...

  6. 201521123060 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1 ...

  7. 201521123088《java程序设计》第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学 ...

  8. 201521123110《Java程序设计》第14周学习总结

    1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 2. 使用JDBC连接数据库与Statement 2.1 使用Statement操作数据库.(粘贴一段你认为比较有价值的代码,出现学 ...

  9. 201521123096《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 (1)互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  10. .Net45下HttpClient的几个缺陷

    前言 最近在写WebClientApi这个组件,底层使用HttpClient,发现HttpClient有许多低级的错误,使用者一不小心就可能会正常的去调用它的这些错误,得不到预期的结果.本文我把我认为 ...