python进程池、线程池

 Python广为使用的并发处理库futures使用入门与内部原理_concurrent.futures-CSDN博客

 ThreadPoolExecutor(max_workers=1)
池中至多创建max_workers个线程的池来同时异步执行,返回Executor实例、支持上下文,进入时返回自己,退出时调用

submit(fn, *args, **kwargs) 
提交执行的函数及其参数,如有空闲开启daemon线程,返回Future类的实例

shutdown(wait=True)
清理池,wait表示是否等待到任务线程完成

future类

done() 
如果调用被成功的取消或者执行完成,返回True

cancelled() 
如果调用被成功的取消,返回True

running() 
如果正在运行且不能被取消,返回True

cancel() 
尝试取消调用。如果已经执行且不能取消返回False,否则返回True

result(timeout=None) 
取返回的结果,timeout为None,一直等待返回;timeout设置到期,抛出concurrent.futures.TimeoutError 异常

exception(timeout=None)
取返回的异常,timeout为None,一直等待返回;timeout设置到期,抛出concurrent.futures.TimeoutError 异常

# coding: utf8
# t.py

import time
import fire
import threading
from concurrent.futures import ThreadPoolExecutor, wait


# 分割子任务
def each_task(index):
    time.sleep(1)  # 睡1s,模拟IO
    print("thread %s square %d" % (threading.current_thread().ident, index))
    return index * index  # 返回结果


def run(thread_num, task_num):
    # 实例化线程池,thread_num个线程
    executor = ThreadPoolExecutor(thread_num)
    start = time.time()
    fs = []  # future列表
    for i in range(task_num):
        fs.append(executor.submit(each_task, i))  # 提交任务
    wait(fs)  # 等待计算结束
    end = time.time()
    duration = end - start
    s = sum([f.result() for f in fs])  # 求和
    print("total result=%s cost: %.2fs" % (s, duration))
    executor.shutdown()  # 销毁线程池


if __name__ == '__main__':
    fire.Fire(run)

python test5.py 5 10   设置了5个线程10个任务

# coding: utf8
# p.py

import os
import sys
import math
import time
import fire
from concurrent.futures import ProcessPoolExecutor, wait


# 分割子任务
def each_task(n):
    # 按公式计算圆周率
    s = 0.0
    for i in range(n):
        s += 1.0 / (i + 1) / (i + 1)
        time.sleep(2)
        # print(s)
        pi = math.sqrt(6 * s)
        print(str(os.getpid())+ "===="+str(pi))
    # os.getpid可以获得子进程号
    sys.stdout.write("process %s n=%d pi=%s\n" % (os.getpid(), n, pi))
    return pi


def run(process_num, *ns):  # 输入多个n值,分成多个子任务来计算结果
    # 实例化进程池,process_num个进程
    executor = ProcessPoolExecutor(process_num)
    start = time.time()
    fs = []  # future列表
    for n in ns:
        fs.append(executor.submit(each_task, int(n)))  # 提交任务
    print("len(fs)", len(fs))
    wait(fs)  # 等待计算结束
    end = time.time()
    duration = end - start
    print("total cost: %.2fs" % duration)
    executor.shutdown()  # 销毁进程池


if __name__ == '__main__':
    # fire.Fire(run)
    run(2,6,10) # 2个线程2个任务

 

import time
from concurrent.futures import ThreadPoolExecutor, wait
import datetime
import logging
import threading
FORMAT = "%(asctime)s [%(processName)s %(threadName)s] %(message)s"
logging.basicConfig(format=FORMAT, level=logging.INFO)


def calc(base):
    sum = base
    for i in range(5):
        time.sleep(1)
        sum += 1
        logging.info(str(sum)+"==========="+str(threading.current_thread()))
    print("sum为",sum)
    return sum


start = datetime.datetime.now()
executor = ThreadPoolExecutor(3) # 设置3个线程
with executor:  # 默认shutdown阻塞
    fs = []
    for i in range(3): # 设置了3个任务同时执行,互不影响
        future = executor.submit(calc, i * 100)
        fs.append(future)
    # wait(fs) # 阻塞
    print('-' * 30)
print("len(fs)",len(fs))
for f in fs:
    print(f, f.done(), f.result())  # done不阻塞,result阻塞
print('=' * 30)
delta = (datetime.datetime.now() - start).total_seconds()
print(delta)

 

import time
from concurrent.futures import ProcessPoolExecutor, wait
import datetime
import logging
import os

FORMAT = "%(asctime)s [%(processName)s %(threadName)s] %(message)s"
logging.basicConfig(format=FORMAT, level=logging.INFO)


def calc(base):
    sum = base
    for i in range(5):
        sum += 1
        time.sleep(2)
        print(str(os.getpid())+"========="+str(sum))
    logging.info(sum)
    return sum

if __name__ == '__main__':

    start = datetime.datetime.now()
    executor = ProcessPoolExecutor(3)
    with executor:  # 默认shutdown阻塞
        fs = []
        for i in range(3):
            future = executor.submit(calc, i * 100)
            fs.append(future)
        # wait(fs) # 阻塞
        print('-' * 30)
    for f in fs:
        print(f, f.done(), f.result())  # done不阻塞,result阻塞
    print('=' * 30)
    delta = (datetime.datetime.now() - start).total_seconds()
    print(delta)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957441.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能之深度学习_[5]-神经网络优化学习率衰减优化正则化方法

文章目录 神经网络入门二3 神经网络优化方法3.1 梯度下降算法回顾3.2 反向传播(BP算法)3.2.1 反向传播概念3.2.2 反向传播详解 3.3 梯度下降优化方法3.3.1 指数加权平均3.3.2 动量算法Momentum3.3.3 AdaGrad3.3.4 RMSProp3.3.5 Adam3.3.6 小结 4 学习率衰…

Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置

Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置 1.Prometheus部署1.2.Prometheus修改默认端口 2.grafana可视化页面部署3.alertmanager部署4.监控配置4.1.主机监控node-exporter4.2.监控mysql数据库mysqld_exporter4.3.监控mongod数据库mongodb_expo…

计算机网络介质访问控制全攻略:从信道划分到协议详解!!!

一、信道划分介质访问控制 介质访问控制:多个节点共享同一个“总线型”广播信道时,可能发生“信号冲突” 应该怎么控制各节点对传输介质的访问,才能减少冲突,甚至避免冲突? 时分复用(TDM) 时分复用:将时间分为等长的“…

2.5G PoE交换机 TL-SE2109P 简单开箱评测,8个2.5G电口+1个10G光口(SFP+)

TPLINK(普联)的万兆上联的2.5G网管交换机TL-SE2109P简单开箱测评。8个PoE 2.5G电口,1个万兆SFP上联口。 2.5G交换机 TL-SE2420 简单开箱评测,16个2.5G电口4个10G光口(SFP):https://blog.zeruns.com/archives/837.html…

王道数据结构day1

2.1线性表的定义和基本操作 1.线性表的定义 相同数据类型的数据元素的有限序列 位序(从1开始) 表头元素,表尾元素 直接钱去,直接后继 2.线性表的基本操作 基本操作:创销,增删改查 优化插入: 查找

PyCharm+RobotFramework框架实现UDS自动化测试- (四)项目实战0x10

1.环境搭建 硬件环境:CANoe、待测设备(包含UDS诊断模块) 2.pythonPyCharm环境 pip install robotframework pip install robotframework-ride pip install openpyxl pip install udsoncan pip install python-can pip install can-isotp3…

KUKA示教器仿真软件OfficeLite8.6.2,EthernetKRL3.1.3通信

一、准备软件。 1、vmware17.6.1 2、OfficeLite8.6.2 3、EthernetKRL3.1.3 4、KUKA Router 5、EthernetKRL_Server 通过网盘分享的文件:库卡相关软件 链接: https://pan.baidu.com/s/1NwvR3RVP0edLBeZnnnCYvw 提取码: smys 二、安装vmware17.6.1 1、找到下载…

保险行业专题|基于超融合实现 IT 基础设施现代化与国产化转型实践

更新内容 更新 SmartX 超融合在保险行业的覆盖范围、部署规模与应用情况。新增异地灾备,以及大数据平台、AI、云原生等数智化转型场景实践。更多超融合金融核心生产业务场景实践,欢迎阅读 3 册电子书(2024.11 更新版)。 【核心业…

玉米植物结构受乙烯生物合成基因 ZmACS7 的调控

摘要: 植物高度和叶片角度是玉米(Zea mays)植物结构的两个关键决定因素,与高种植密度下的抗倒伏性和冠层光合作用密切相关。这两个性状主要由几种植物激素调节。然而,乙烯在调节玉米植物结构中的机制,特别…

浅谈云端编辑器,分析其亮点与不足

浅谈云端编辑器,分析其亮点与不足 这个云端编辑器界面可以分为左侧题目筛选栏、中间题目描述与代码编辑区域、右侧AI提示功能三部分。以下是详细的分析: 1. 左侧题目筛选栏 层次结构清晰:左侧栏展示了一个层级结构,题目按主题分…

Zinc Finger锌指结构:

1,是一种蛋白质中的规律性结构,motif 是DNA结合motif(和DNA结合的部分里的规律性结构) 形状类似手指 2,不仅能结合DNA、RNA,还能结合蛋白质、脂质等 3,经典结构例如C2H2:也称为Cys…

安装wxFormBuilder

1. 网址:GitHub - wxFormBuilder/wxFormBuilder: A wxWidgets GUI Builder 2. 安装MSYS2 MSYS2可以在GitHub的内容中找到,这个版本是32位64位的 3. 在程序中打开MINGW64 shell 4. 在MSYS2 MINGW64 shell中输入 pacman -Syu pacman -S ${MINGW_PACKAGE…

leetcode 1620. 网络信号最好的坐标

题目如下 数据范围 示例 观察数据范围我们可以看到信号塔最多只有50座而x 与 y范围则是在0到50之间。 如果我们暴力枚举的话计算次数最多51 * 51 * 50时间复杂度即为O(n * n * M) 显然题目暗示我们使用枚举法通过代码 class Solution { public:vect…

Ansible fetch模块详解:轻松从远程主机抓取文件

在自动化运维的过程中,我们经常需要从远程主机下载文件到本地,以便进行分析或备份。Ansible的fetch模块正是为了满足这一需求而设计的,它可以帮助我们轻松地从远程主机获取文件,并将其保存到本地指定的位置。在这篇文章中&#xf…

数据恢复常用方法(三)如何辨别固态硬盘故障类型

数据恢复首先需要辨别固态硬盘故障类型,只有先确认故障类型,才能进行下一步动作 如下是一种常见的场景,固态硬盘无法识别,接入电源与数据线,电脑的磁盘管理不显示任何信息。 第一步:确认硬件状态&#xff…

七.网络模型

最小(支撑)树问题 最小部分树求解: 破圈法:任取一圈,去掉圈中最长边,直到无圈; 加边法:取图G的n个孤立点{v1,v2,…, vn }作为一个支撑图,从最短…

Django学习笔记(项目默认文件)-02

Django学习笔记(项目默认文件)-02 一、项目默认文件介绍 1、项目的文件结构 django_demo-manage.py (项目的管理、启动、创建app、数据管理)-django_demo-__init__.py-asgi.py (接受网络请求)-settings.py (项目配置文件)-urls…

虚幻商城 Fab 免费资产自动化入库

文章目录 一、背景二、实现效果展示三、实现自动化入库一、背景 上一次写了个这篇文章 虚幻商城 Quixel 免费资产一键入库,根据这个构想,便决定将范围扩大,使 Fab 商城的所有的免费资产自动化入库,是所有!所有! 上一篇文章是根据下图这部分资产一键入库: 而这篇文章则…

将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(3.纯python的实惠版)

前情: 将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(1.标准版)-CSDN博客 将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(2.换掉付费的Event Hubs)-CSDN博客 python脚本实现 厉害的…

开关电源基础

文章目录 线性电源与开关电源选用 开关稳压器脉宽调制简化的降压开关电源 开关电源类型输出电压分拓扑分 控制器与稳压器效率与 V o u t V_{out} Vout​ 同步与非同步隔离与非隔离非隔离式拓扑结构隔离式拓扑结构 线性电源与开关电源 线性稳压器就是我们通常说的LDO: 传输元件…