Python有多种方法可以进行并行计算,以下是其中几种常见的方法:
import multiprocessing
def worker(num):
"""子进程要执行的任务"""
print(f"Worker {num} is running...")
if __name__ == '__main__':
# 创建3个进程
for i in range(3):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
import threading
def worker(num):
"""子线程要执行的任务"""
print(f"Worker {num} is running...")
if __name__ == '__main__':
# 创建3个线程
for i in range(3):
t = threading.Thread(target=worker, args=(i,))
t.start()
import asyncio
async def worker(num):
"""协程要执行的任务"""
print(f"Worker {num} is running...")
await asyncio.sleep(1) # 模拟耗时的操作
if __name__ == '__main__':
# 创建一个事件循环
loop = asyncio.get_event_loop()
# 创建3个协程并加入事件循环
for i in range(3):
task = loop.create_task(worker(i))
loop.run_until_complete(task)
# 关闭事件循环
loop.close()
在多进程编程中,子进程的返回值通常需要通过进程间通信的方式传递给主进程。Python提供了多种进程间通信的方式,例如管道(Pipe)、队列(Queue)、共享内存(Value和Array)等。
下面是一个使用队列传递子进程返回值的示例代码:
import multiprocessing
def worker(num, result_queue):
"""子进程要执行的任务"""
print(f"Worker {num} is running...")
# 将结果放入队列中
result_queue.put(num ** 2)
if __name__ == '__main__':
# 创建队列用于存放子进程返回值
result_queue = multiprocessing.Queue()
# 创建3个进程
processes = []
for i in range(3):
p = multiprocessing.Process(target=worker, args=(i, result_queue))
processes.append(p)
p.start()
# 等待所有进程执行完毕
for p in processes:
p.join()
# 从队列中取出结果并打印
while not result_queue.empty():
result = result_queue.get()
print(f"Result: {result}")
在这个示例中,我们使用了一个队列(result_queue)来存放子进程的返回值。子进程在完成任务后,将结果放入队列中。主进程在等待所有子进程执行完毕后,从队列中取出结果并打印。
当然,具体的实现方式会根据不同的需求而有所差异,需要根据实际情况选择合适的进程间通信方式和数据结构。