我正在从"Python简介"中学习multiprocessing
,有这样一个例子来演示multiprocessing
import os
import multiprocessing as mp
def do_this(what):
whoami(what)
def whoami(what):
print(f"Process {os.getpid()} says: {what}.")
if __name__ == "__main__":
whoami("I'm the main program.")
for i in range(4):
p = mp.Process(target=do_this, args=(f"I'm function {i}",))
p.start()
def do_this(what):
whoami(what)
def whoami(what):
print(f"Process {os.getpid()} says: {what}.")
if __name__ == "__main__":
whoami("I'm the main program.")
for i in range(4):
do_this(f"I'm function {i}")
运行它并过来:
## -- End pasted text --
Process 2197 says: I'm the main program..
Process 2294 says: I'm function 1.
Process 2293 says: I'm function 0.
Process 2295 says: I'm function 2.
Process 2296 says: I'm function 3.
但是,只需一个过程即可轻松实现:
def do_this(what):
whoami(what)
def whoami(what):
print(f"Process {os.getpid()} says: {what}.")
if __name__ == "__main__":
whoami("I'm the main program.")
for i in range(4):
do_this(f"I'm function {i}")
## -- End pasted text --
Process 2197 says: I'm the main program..
Process 2197 says: I'm function 0.
Process 2197 says: I'm function 1.
Process 2197 says: I'm function 2.
Process 2197 says: I'm function 3.
我尽力掌握multiprocessing
的想法,以及如果不引入它解决了什么问题。
在上述情况下,multiprocessing
的额外好处是什么
多处理背后的想法是,你可以处理一个需要大量数学才能运行的问题,并在多个计算系统之间分配工作负载。
这通常在一台计算机中完成,但也可以通过计算机网络进行。在python的情况下,"多进程"在一台计算机中执行。
这种工作方式是现代CPU有几个内核。每个内核就像它自己的处理器,因为它一次可以处理一个线程。
CPU 被划分为内核的原因是,很难使单个内核更快,但添加更多内核很容易,这反过来又为您提供了更多的总处理能力。
这样做的问题是每个内核一次只能执行一个线程。因此,如果您的程序是完全单线程的,那么无论您拥有多少个内核,它都只会以它所在的单核的速度运行。
像上面那样划分你的 python 脚本会把它分成几个线程,这些线程可以在不同的内核上独立运行。每个核心处理您交给它的任务,最终答案被组合并打印到屏幕上。
在您的示例中,使用多处理确实没有好处,因为您没有做大量的工作来减慢程序的速度,但是假设您有大量的数组需要昂贵的数学运算才能运行,将该数组划分为多个部分并将这些部分分配给不同的进程将使整个程序运行得更快。