参考: https://www.liaoxuefeng.com/wiki/1016959663602400/1017627212385376
个人封装的python多进程处理类,跑满CPU,优化性能
概念
进程: 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。
线程:有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。
由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU才可能实现。
总结一下就是,多任务的实现有3种方式:
多进程模式;
多线程模式;
多进程+多线程模式。
概念小结
线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。
多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。
多进程(multiprocessing)
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()