Python 除了反对多线程,还反对多过程。相比于多线程,多过程能够充分利用多核 CPU 的计算能力,实现真正的并行计算。在本文中,咱们将介绍 Python 中的多过程,以及如何应用 Python 的 multiprocessing 模块创立和治理过程。
一、什么是过程?
过程是操作系统分配资源的根本单位。每个过程都有本人的内存空间,这意味着过程之间的变量是隔离的,一个过程无法访问另一个过程的变量。
二、Python 中的过程
在 Python 中,咱们能够应用 multiprocessing 模块创立和治理过程。以下是一个创立过程的例子:
from multiprocessing import Process
def print_numbers():
for i in range(10):
print(i)
def print_letters():
for letter in 'abcdefghij':
print(letter)
process1 = Process(target=print_numbers)
process2 = Process(target=print_letters)
process1.start()
process2.start()
process1.join()
process2.join()
在这个例子中,咱们创立了两个过程:process1 和 process2。process1 的工作是打印数字 0 到 9,process2 的工作是打印字母 ’a’ 到 ’j’。
咱们应用 multiprocessing.Process 类创立了两个过程对象,并指定了每个过程的指标函数。而后,咱们调用了 start 办法来启动过程。
join 办法用于期待过程完结。这是阻塞调用,也就是说,调用 join 办法的过程(在这个例子中是主过程)会被阻塞,直到被调用 join 办法的过程(在这个例子中是 process1 和 process2)完结。
三、过程间通信
因为过程之间的内存是隔离的,所以过程之间不能间接通信。Python 的 multiprocessing 模块提供了多种过程间通信的工具,包含管道(Pipe)、队列(Queue)等。以下是一个应用队列进行过程间通信的例子:
from multiprocessing import Process, Queue
def worker(q):
q.put('Hello, world!')
def main():
q = Queue()
p = Process(target=worker, args=(q,))
p.start()
print(q.get())
p.join()
if __name__ == '__main__':
main()
在这个例子中,咱们创立了一个子过程,该子过程向队列中增加了一个音讯。主过程从队列中获取了这个音讯,并打印了它。通过队列,咱们实现了过程间的通信。
四、进程同步
和线程一样,过程也可能须要同步。Python 的 multiprocessing 模块提供了多种进程同步的工具,包含锁(Lock)、信号量(Semaphore)等。
五、Python 中的过程池
在 Python 中,咱们能够应用 multiprocessing.Pool 类创立一个过程池。过程池中的过程数量是固定的,当有新的工作提交到过程池时,如果过程池中有闲暇的过程,那么这个过程就会被调配到这个工作。如果所有的过程都在忙,那么这个工作就会期待,直到有过程变成闲暇状态。以下是一个应用过程池的例子:
pythonCopy code
from multiprocessing import Pool
def square(x):
return x * x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(square, [1, 2, 3, 4, 5]))
在这个例子中,咱们创立了一个蕴含 5 个过程的过程池。而后,咱们应用 map 办法提交了一组工作到过程池。这组工作是计算一组数字的平方。map 办法会主动调配这些工作到过程池中的过程。
六、论断
Python 的多过程是一种弱小的工具,能够帮忙咱们编写出更高效的程序。然而,与所有并发编程一样,多过程编程也有其复杂性。为了防止竞态条件和其余并发问题,咱们须要认真地设计咱们的程序,并正确地应用进程同步工具。
以上就是对 Python 多过程的根本介绍,心愿对你有所帮忙。
七、最初
如果感觉本文对你有帮忙记得 点个关注,给个赞,加个珍藏, 更多精彩内容欢送查看。