在计算密集型任务中,利用多核处理器进行并行计算是提高程序效率的关键。Python的multiprocessing模块为我们提供了强大而简单的多进程操作工具,让我们一起来探索其魔力吧。
创建并启动子进程 通过multiprocessing模块,我们可以轻松地创建并启动子进程。以下是一个简单的使用范例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import multiprocessingimport osdef worker (): print ("子进程(Process:{})开始执行...父进程为(Process:{})" .format (os.getpid(), os.getppid())) if __name__ == "__main__" : print ("主进程(Process:{})开始执行..." .format (os.getpid())) process = multiprocessing.Process(target=worker) process.start() process.join()
在上述示例中,我们使用multiprocessing.Process类创建了一个子进程,并指定了其执行的函数。通过start()方法启动子进程,并通过join()方法等待子进程执行完毕。
进程间通信 多个进程之间的数据交换和通信是一项关键任务。multiprocessing模块提供了多种机制来实现进程间通信,比如队列(Queue)、管道(Pipe)等。以下是一个使用队列进行进程间通信的范例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import multiprocessingimport randomimport timedef producer (_queue ): for i in range (5 ): time.sleep(round (random.random() * 5 )) _queue.put(i) print ("生产了数据:" , i) def consumer (_queue ): while True : time.sleep(round (random.random() * 3 )) data = _queue.get() if data is None : break print ("消费了数据:" , data) if __name__ == "__main__" : queue = multiprocessing.Queue() process1 = multiprocessing.Process(target=producer, args=(queue,)) process2 = multiprocessing.Process(target=consumer, args=(queue,)) process1.start() process2.start() process1.join() process2.join()
在上述示例中,我们通过multiprocessing.Queue创建了一个队列,用于在生产者进程和消费者进程之间传递数据。生产者进程通过put()方法向队列中放入数据,消费者进程通过get()方法从队列中获取数据。
并行计算 multiprocessing模块使得并行计算变得轻而易举。以下是一个简单的并行计算范例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import multiprocessingimport timedef find_primes_within_n (n ): primes = [] is_prime = [True ] * (n + 1 ) is_prime[0 ], is_prime[1 ] = False , False for num in range (2 , n + 1 ): if is_prime[num]: primes.append(num) for multiple in range (num * num, n + 1 , num): is_prime[multiple] = False return primes if __name__ == "__main__" : numbers = [12213651 ] * 10 print (numbers) start_time = time.time() result = [] for number in numbers: result.append(find_primes_within_n(number)) end_time = time.time() print ("单进程运行时间" , end_time - start_time, "seconds" ) start_time = time.time() pool = multiprocessing.Pool() results = pool.map (find_primes_within_n, numbers) pool.close() pool.join() end_time = time.time() print ("多进程运行时间" , end_time - start_time, "seconds" )
在上面的示例中,我们通过multiprocessing.Pool创建了一个进程池,并使用map()方法将任务分配给不同的子进程进行并行计算,最终得到了计算结果。
通过multiprocessing模块,我们可以更好地利用计算资源,加速程序的执行。让我们一起探索并发编程的奇妙世界,释放Python潜能,提升程序的计算效率。