我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python获取多进程执行的返回值

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python获取多进程执行的返回值

Python获取多进程执行的返回值

众所周知,因为GIL的原因,Python至今不支持真正的多线程。为了达到并行运行的目的,我们往往就需要运行多进程了。
一个任务由一个进程来运行,可是它的结果怎么来获取呢?

方法-1.

第一种方法是记录在全局变量中。当然这时候要注意可能会需要用到Lock. 下面是一个例子。

Program-1

import multiprocessingfrom multiprocessing import Poolinfo_manager = multiprocessing.Manager()info_lock = info_manager.Lock()info_dict = info_manager.dict()def add(n):    global info_dict, info_lock         s = 0    for i in range(n+1):        s += i        info_lock.acquire()    info_dict[n] = s    info_lock.release()        print("In task %d: %d -> %d" % (n, n, s))def calculate():    pool = Pool(processes=4)     tasks = range(10)    for n in tasks:        pool.apply_async(add, (n,))            pool.close()    pool.join()        def print_result():    global info_dict        key_list = sorted(info_dict.keys())        for key in key_list:        print("%s: %s" % (key, info_dict[key]))         if __name__ == '__main__':    calculate()    print_result()    

除了使用全局变量,还有没有其他的方法呢?毕竟全局变量似乎看起来有点危险,不小心就会被弄坏。

方法-2.

第二种方法,就是记录下multiprocessing.Pool.apply_async的返回值(假设称之为result),然后在Pool被join之后,利用result.get()方法来得到原任务函数的返回值。在这里,multiprocessing.Pool.apply_async的返回值的类型是multiprocessing.pool.ApplyResult,其get()方法会返回原任务函数的返回值。

下面是把上面的那个例子重新写一遍。
Program-2

import multiprocessingfrom multiprocessing import Pooldef add(n):    s = 0    for i in range(n+1):        s += i    return (n, s)def calculate():    pool = Pool(processes=4)    tasks = range(10)    result_list = list()    info_dict = dict()        for n in tasks:        result_list.append(pool.apply_async(add, (n,)))            pool.close()    pool.join()        for result in result_list:        k, v = result.get()        info_dict[k] = v            return info_dict        def print_result():    info_dict = calculate()        key_list = sorted(info_dict.keys())        for key in key_list:        print("%s: %s" % (key, info_dict[key]))         if __name__ == '__main__':    calculate()    print_result()    

另外,其实也可以不用等到 Pool join 之后才能调get(). 可以立刻调用get(), 但这可能会造成阻塞。
get()函数其实有一个参数,可以指定超时时间以免无限等下去,如,result.get(timeout=2), 就是设置超时为2秒。

其定义在Python3中如下:

get([timeout])    Return the result when it arrives.     If timeout is not None and the result does not arrive within timeout seconds     then multiprocessing.TimeoutError is raised.     If the remote call raised an exception then that exception will be reraised by get().

也就是说,如果超时了,就会抛出一个multiprocessing.TimeoutError异常;
而如果该任务进程内抛了异常,也会被get()重新抛出来。

本文程序通过Python2和Python3的测试。

(END)

来源地址:https://blog.csdn.net/nirendao/article/details/129325450

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python获取多进程执行的返回值

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python获取多进程执行的返回值实现

本文主要介绍了Python获取多进程执行的返回值实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-06

Python如何获取多进程执行的返回值

这篇文章主要介绍了Python如何获取多进程执行的返回值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python如何获取多进程执行的返回值文章都会有所收获,下面我们一起来看看吧。方法-1.第一种方法是记录在全
2023-07-05

python多进程获取返回值

https://segmentfault.com/q/1010000010403117/a-10200000104113061. multiprocessing.Processdef worker(procnum, return_dict)
2023-01-31

python多线程怎么获取返回值

在Python中,可以使用`threading`模块来实现多线程。但是多线程中获取线程返回值稍微复杂一些,因为多线程中的线程是并发执行的,无法直接获取返回值。一种常见的方法是使用`threading.Thread`的`join()`方法等
2023-10-26

python多线程返回值如何获取

在Python中,可以使用`concurrent.futures`模块来实现多线程并获取返回值。具体步骤如下:导入`concurrent.futures`模块:import concurrent.futures定义一个函数来执行多线程任务
2023-10-27

python获取多线程及子线程的返回值

最近有个需求,用多线程比较合适,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装import threading class MyThread(threading.Thread):def __init
2022-06-04

python如何获取线程返回值

Python中可以通过使用`threading`模块的`Thread`类来创建线程,但是线程对象无法直接返回值。如果想要获取线程的返回值,可以使用以下两种方法:1. 使用`threading`模块的`Thread`类的`join()`方法来
2023-08-11

python多线程中获取函数返回值的三种方法

本文主要介绍了python多线程中获取函数返回值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-01

Python获取线程返回值的方式有哪些

这篇文章主要讲解了“Python获取线程返回值的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python获取线程返回值的方式有哪些”吧!方法一:使用全局变量的列表,来保存返回值r
2023-07-06

python多线程中获取函数返回值的方法有哪些

这篇文章主要介绍“python多线程中获取函数返回值的方法有哪些”,在日常操作中,相信很多人在python多线程中获取函数返回值的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python多线程中获
2023-07-05

Python获取协程返回值的方式有哪些

这篇文章主要介绍“Python获取协程返回值的方式有哪些”,在日常操作中,相信很多人在Python获取协程返回值的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python获取协程返回值的方式有哪些
2023-06-22

python使用threading获取线程函数返回值的实现方法

threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。 threading模块提供的类: Thread, Lock, Rlock
2022-06-04

Python执行操作系统命令并取得返回值和退出码,支持有互信的远程执行

def exec_command(shell_cmd, hostname=None): if hostname: p = Popen(/usr/bin/ssh -Tq +hostname, shell=True, std
2023-06-04

解决python多线程的返回值问题

前几天看了下python的多线程,但是发现创建的线程得不到函数的返回值,查阅资料发现需要重写Thread类,直接上代码。import threadingimport time"""重新定义带返回值的线程类"""class MyThread(
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录