python多进程程序设计 之二

news/2024/9/18 20:17:25 标签: python, 开发语言

python多进程程序设计 之二

  • ProcessPoolExecutor
    • 构造器
    • 成员函数map
    • 成员函数submit
    • 实列代码

ProcessPoolExecutor

ProcessPoolExecutor 类是 Executor 子类,它使用进程池异步执行调用。 ProcessPoolExecutor 使用multiprocessing模块,这允许它绕过全局解释器锁,但也意味着只能执行和返回可序列化的对象。

main 模块必须可由工作子进程导入。这意味着 ProcessPoolExecutor 将无法在交互式解释器中工作。

从提交给 ProcessPoolExecutor 的可调用对象中调用 Executor 或 Future 方法将导致死锁。

构造器

词法: concurrent.futures.ProcessPoolExecutor(max_workers=None, mp_context=None, initializer=None, initargs=(), max_tasks_per_child=None)

ProcessPoolExecutor类是Executor子类,使用最多 max_workers 进程池异步执行调用。

  • 如果max_workers为None,或未给出,则它将默认为计算机上的处理器数量。如果 max_workers 小于或等于 0,则会产生ValueError。
    在 Windows 上,max_workers 必须小于或等于 61。如果不是,则将产生ValueError。如果max_workers为None,则默认选择的数量最多为 61,即使有更多处理器可用。
  • mp_context 可以是multiprocessing上下文,或None。它将用于启动工作进程。如果 mp_context为None,或未给出,则使用默认的multiprocessing上下文。
  • initializer, initializer是一个可选的可调用对象,在每个工作进程启动时调用;
  • initargs 是传递给initializer程序的参数元组。如果initializer程序产生异常,则所有当前挂起的作业,以及向池提交更多作业的任何尝试,都将产生BrokenProcessPool。
  • max_tasks_per_child 是一个可选参数,指定单个进程在退出,并被新的工作进程替换之前,可以执行的最大任务数。默认情况下 max_tasks_per_child 为 None,这意味着工作进程将一直存在,直到池也消亡。

成员函数map

词法:map(fn, *iterables, timeout=None, chunksize=1)

如果调用 next(),并且在原始调用到Executor.map() 的timeout 秒数后,结果仍不可用,则返回的迭代器产生TimeoutError。 timeout 可以是 int 或 float。如果未指定timeout,或指定为None,则没有等待时间限制。

如果 fn 调用引发异常,则迭代器取值时,产生异常。

使用 ProcessPoolExecutor 时,此方法将可迭代对象分割成多个块,并将这些块作为单独的任务提交到池中。这些块的(近似)大小可以通过将 chunksize 设置为正整数来指定。对于非常长的可迭代对象,与默认大小 1 相比,使用较大的 chunksize 值,可以显着提高性能。

import time
import concurrent.futures
from multiprocessing import *

val_set = [1, 2, 3, 4, 5, 6, 7]
 
def cube(val):
    result = val * val * val
    time.sleep(0.5)
    print("[Process ID]:{0} cube({1}) = {2}".format(current_process().name, val, result))
    return [val, result]

def main(): 
    result = []
    with concurrent.futures.ProcessPoolExecutor(3) as exe:
        ret_val = exe.map(cube, val_set)
   
        for v in ret_val:
            result.append(v)

    print(result)

if __name__ == "__main__":
    freeze_support()
    main()

[Process ID]:SpawnProcess-1 cube(1) = 1
[Process ID]:SpawnProcess-2 cube(2) = 8
[Process ID]:SpawnProcess-3 cube(3) = 27
[Process ID]:SpawnProcess-1 cube(4) = 64
[Process ID]:SpawnProcess-2 cube(5) = 125
[Process ID]:SpawnProcess-3 cube(6) = 216
[Process ID]:SpawnProcess-1 cube(7) = 343
[[1, 1], [2, 8], [3, 27], [4, 64], [5, 125], [6, 216], [7, 343]]

成员函数submit

词法:submit(fn, *args, **kwargs)

规划可调用函数fn运行,*args, **kwargs作为函数的产生, 即,fn(*args, **kwargs) ,并返回一个Future 对象,该Future 对象表示可调用函数执行情况 。

from concurrent.futures import *
from multiprocessing import *

def cube(v1, v2, width, length):
    print("v1:{0}  v2:{3}  width:{1} length:{2}".format(v1, width, length, v2))
    return [v1*v2, width * length]

def main():    
    with ProcessPoolExecutor(max_workers=2) as executor:
        args = [3, 5]
        kwargs = {"width":10, "length":30}
        future = executor.submit(cube, *args, **kwargs)
        print(future.result())
    
if __name__ == "__main__":
    freeze_support()
    main()
v1:3  v2:5  width:10 length:30
[15, 300]

实列代码

import math
from multiprocessing import *
from concurrent.futures import *

PRIMES = [
    112272635095293,
    112582705942171,
    112217253509529,
    115280095190773,
    115797848077099,
    
    215797848077091,
    315797848077095,
    415797848077097,
    
    199726899285419]

def is_prime(n):
    print("Process: {0} n: {1}".format(current_process().name, n))
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False

    sqrt_n = int(math.floor(math.sqrt(n)))
    for i in range(3, sqrt_n + 1, 2):
        if n % i == 0:
            return False
    return True

def main():
    result=[]
    
    with ProcessPoolExecutor(max_workers=3) as executor:
        for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
            result.append([number, prime])

    for number, prime in result:
        print('%d is prime: %s' % (number, prime))

if __name__ == '__main__':
    main()

Process: SpawnProcess-1 n: 112272635095293
Process: SpawnProcess-1 n: 112582705942171
Process: SpawnProcess-2 n: 112217253509529
Process: SpawnProcess-2 n: 115280095190773
Process: SpawnProcess-3 n: 115797848077099
Process: SpawnProcess-1 n: 215797848077091
Process: SpawnProcess-1 n: 315797848077095
Process: SpawnProcess-1 n: 415797848077097
Process: SpawnProcess-1 n: 199726899285419
112272635095293 is prime: False
112582705942171 is prime: True
112217253509529 is prime: False
115280095190773 is prime: True
115797848077099 is prime: True
215797848077091 is prime: False
315797848077095 is prime: False
415797848077097 is prime: False
199726899285419 is prime: False

http://www.niftyadmin.cn/n/5664458.html

相关文章

千益畅行:旅游卡免费服务,包含哪些内容?

​凭此卡可免费旅游&#xff0c;单卡支持2-6人同行&#xff0c;免费服务内容包含&#xff1a;酒店住宿、团餐、景区首道大门票、导游、大巴、旅游责任险、接送机等&#xff0c;目前支持全国40多条旅游线路&#xff0c;爱旅游的朋友们可以约起来&#xff01; #旅游卡服务#

CSP-J 算法基础 广度优先搜索BFS

文章目录 前言广度优先搜索是什么广度优先搜索的实现BFS 的具体编程实现举例&#xff1a;广度优先搜索的具体步骤初始状态&#xff1a;步骤 1&#xff1a;加入起点节点 1步骤 2&#xff1a;访问队列中的节点 1&#xff0c;加入其邻居节点 2 和 4步骤 3&#xff1a;访问队列中的…

(CS231n课程笔记)深度学习之损失函数详解(SVM loss,Softmax,熵,交叉熵,KL散度)

学完了线性分类&#xff0c;我们要开始对预测结果进行评估&#xff0c;进而优化权重w&#xff0c;提高预测精度&#xff0c;这就要用到损失函数。 损失函数&#xff08;Loss Function&#xff09;是机器学习模型中的一个关键概念&#xff0c;用于衡量模型的预测结果与真实标签…

Linux 调用write()函数后,内核一般多久将数据写入磁盘

在 Linux 中&#xff0c;调用 write() 函数后&#xff0c;内核将数据写入磁盘的时间是不确定的。 这取决于多种因素&#xff1a; 1. 文件系统的缓存机制&#xff1a;为了提高性能&#xff0c;文件系统通常会将数据缓存在内存中&#xff0c;然后在合适的时机批量写入磁盘。…

springboot+security为什么@ControllerAdvice自定义的异常处理没有生效

意外遇到一个无语的bug。项目架构差不多&#xff0c;为什么本项目的ControllerAdvice自定义的异常处理没有生效&#xff0c;其他的就可以。 调试如下&#xff1a; 在捕获异常的位置debug ControllerAdvice 标注的类是否被 Spring 容器正确管理。 很明显&#xff0c;没有。找到…

linux安装solr

Solr Downloads - Apache Solr 直接下载&#xff1a;https://dlcdn.apache.org/solr/solr/9.7.0/solr-9.7.0.tgz 这个包依赖jdk11以上版本 需要jdk1.8版本的&#xff0c;下载Index of /dist/lucene/solr/7.1.0 # 解压 tar -zxvf solr-9.7.0.tgz # 进入启动目录 cd solr-9.7…

隐藏excel单元格数据的两个方法

在Excel中&#xff0c;公式是用来计算数据和结果的非常重要的一部分。但是&#xff0c;有时候您可能希望隐藏公式&#xff0c;以保护其不被他人修改或查看。那么今天小编就来给大家分享隐藏excel单元格数据的方法。 一、使用“隐藏”功能 在Excel中&#xff0c;我们还可以使用…

webGL 综合教程100+【目录】

webGL 综合教程100旨在为开发者提供两大方面的知识信息&#xff1a;&#xff08;1&#xff09;提供详细的每个api知识点的详解 &#xff08;2&#xff09;提供实战的示例&#xff0c;提供源代码。 在这量大系统性的知识下&#xff0c;给用户提供清晰的思路和示例参考&#xff0…