multiprocessing是Python的一个库,用于在同一台计算机的不同CPU核之间并行执行代码。它通过使用进程(而不是线程)实现并行,因此可以避免Python中全局解释器锁(GIL)的限制。
multiprocessing库提供了一种类似于线程的API,但它是基于多个进程的。它使得开发者能够编写可以在不同的进程中运行的代码,并且这些进程之间可以通过管道或共享内存进行通信。
Process类是multiprocessing的核心类之一,用于创建和控制进程。它的构造函数有两个必须的参数——target和args。其中,target是一个函数或方法,表示要在新进程中执行的代码;args是一个元组或列表,表示传递给target函数的参数。
以一个简单的示例来说明Process类的使用方法:
import multiprocessing
import time
def worker(num):
print('Worker %d starts working.' % num)
time.sleep(3)
print('Worker %d ends working.' % num)
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
for j in jobs:
j.join()
在该示例中,我们定义了一个worker函数,模拟一个工作进程,每个工作进程都会执行一个类似于“忙等待”的操作(time.sleep(3)),并打印出工作进程编号。在主进程中,我们使用Process类创建5个工作进程对象,然后运行它们并等待所有工作进程结束(通过p.join()实现)。
对于一组需要执行相同任务的进程,可以使用Pool类来批量创建和管理它们。Pool类提供了常用的方法,例如apply_async()、map()、imap_unordered()等,用于提交任务和获取结果。
下面是一个简单的示例:
import multiprocessing
import time
def worker(num):
print('Worker %d starts working.' % num)
time.sleep(3)
print('Worker %d ends working.' % num)
return num
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=5)
results = pool.map(worker, range(5))
pool.close()
pool.join()
print(results)
在该示例中,我们定义了一个worker函数,模拟一个工作进程,并返回进程编号。在主进程中,我们使用Pool类创建一个拥有5个进程的进程池(pool),然后使用map()方法提交五个任务,并等待所有任务执行完毕。最后,任务的结果会以一个列表的形式返回,并打印出来。
使用multiprocessing库时需要注意以下几点:
(1)由于各个进程之间的环境是独立的,所以它们之间无法共享变量,必须使用multiprocessing提供的队列、管道、共享内存等方式进行通信和数据共享。
(2)使用multiprocessing库时,需要注意多进程之间不能直接使用全局变量,这会导致数据错乱或无法共享。一般来说,可以将全局变量传递给进程或使用共享内存等方式进行数据传输。
(3)与多线程相比,多进程的启动和销毁时间较长,因此在使用时需要考虑进程创建和销毁的开销,以及进程间通信的开销。
(4)在使用多进程时,要注意避免死锁和竞争状态等并发编程的问题。可以使用锁、信号量等方式确保进程之间的同步和安全。