个人封装的python多进程处理类,跑满CPU,优化性能



from multiprocessing import Pool

from tqdm import tqdm


class SelfMultiple:
    def __init__(self, func, process: int, params: list, custom_callback=False, callback=None):
        print("==>init customized multiple class")
        self.func = func
        self.params = params
        self.process = process
        self.custom_callback = custom_callback
        self.callback = callback

    def run(self):
        self.pool = Pool(processes=self.process)

        if self.custom_callback == False:
            print("==>undefined self callback")

            pbar = tqdm(total=len(self.params))

            def update(*a):
                pbar.update()

            for param in self.params:
                result = self.pool.apply_async(self.func, param, callback=update)
                result.get()
        else:
            print("==>defined self callback")
            print(f"==>executing || {self.func}")
            for param in self.params:
                result = self.pool.apply_async(self.func, param, callback=self.callback)
                result.get()
        self.pool.close()
        self.pool.join()

如何调用呢?

def add(x, y):
    print(f"adding || {x} + {y}")
    return x + y


if __name__ == "__main__":

    params = [(1, 2), (3, 4), (5, 6), (7, 8)]

    multiple_tool = SelfMultiple(add, process=10, params=params, custom_callback=False)
    multiple_tool.run()

在这里插入图片描述
个人测试了一下超大型任务,CPU是可以跑满的,有一个大型任务从400小时优化到了26小时。

另外,也可以用多线程的方式跑


from multiprocessing import Pool

from tqdm import tqdm
import threading
from datetime import datetime
import logging
import time


class SelfMultipleThreads:
    def __init__(self, func, process: int, params: list, custom_callback=False, callback=None,args=None):
        print("==>init customized multiple class")
        self.func = func
        self.params = params
        self.process = process
        self.custom_callback = custom_callback
        self.callback = callback
        self.threads = []
        self.args = args
        for i in range(len(params)):
            self.threads.append(threading.Thread(target=self.func, args=params[i]))
    def run(self):
        pbar = tqdm(total=len(self.params)//self.process)
        for i in range(0,len(self.threads),self.process):
            threads = self.threads[i:i+self.process]
            for thread in threads:
                thread.start()
            # 等待所有线程执行完毕
            for thread in threads:
                thread.join()
            pbar.update()
            if self.args.debug:
                break

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,以下是一个简单的Python多进程,可以控制进程数: ```python import multiprocessing import queue class ProcessPool: def __init__(self, max_workers): self.max_workers = max_workers self.workers = [] self.tasks = multiprocessing.Queue() def start(self): for i in range(self.max_workers): worker = multiprocessing.Process(target=self.worker) worker.start() self.workers.append(worker) def submit(self, func, *args, **kwargs): self.tasks.put((func, args, kwargs)) def worker(self): while True: try: func, args, kwargs = self.tasks.get(timeout=1) except queue.Empty: break try: func(*args, **kwargs) except Exception as e: print('Error:', e) def join(self): for worker in self.workers: worker.join() ``` 在这个中,我们使用了Python内置的`multiprocessing`模块和`queue`模块,实现了一个进程池。在`__init__`方法中,我们初始化了进程池的最大工作进程数、工作进程列表和任务队列。`start`方法启动了所有工作进程,并将它们存储在`workers`列表中。`submit`方法用于向任务队列中提交任务。`worker`方法是每个工作进程的执行函数,它会从任务队列中获取任务,并调用相应的函数执行任务。在执行任务时,我们通过`try...except`块捕获异常,避免进程因异常而终止。最后,在`join`方法中阻塞主进程,直到所有任务都被处理完毕。 使用该进程池时,可以先实例化一个`ProcessPool`对象,并指定最大工作进程数,然后调用`start`方法启动工作进程。随后,可以通过`submit`方法向任务队列中提交任务,任务可以是任何可调用对象,例如函数或方法。最后,调用`join`方法等待所有任务完成即可。 例如,以下是一个例子: ```python def task(num): print('Task', num, 'started') time.sleep(1) print('Task', num, 'finished') pool = ProcessPool(max_workers=2) pool.start() for i in range(10): pool.submit(task, i+1) pool.join() ``` 在这个例子中,我们定义了一个`task`函数,其功能是打印出任务编号,然后等待一秒钟,最后再打印出任务编号。接着,我们实例化了一个进程池,最大工作进程数为2,并启动了工作进程。然后,我们向任务队列中提交了10个任务,每个任务执行的是`task`函数。最后,我们调用`join`方法等待所有任务完成。 由于进程池中最大工作进程数为2,因此在任意时刻,最多只有2个任务在同时执行。这样可以控制进程数,避免进程数量过多导致系统性能下降。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古承风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值