1. 多进程
在 Python 中,多进程是通过 multiprocessing 模块实现的。具体来说,可以通过 multiprocessing.Process
创建进程,并且可以通过 Process.start()
启动进程,通过 Process.join()
等待进程结束。
下面是一个使用多进程的例子:
import multiprocessing
def worker(num):
print('Worker: %s' % num)
if __name__ == '__main__':
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
在这个例子中,我们创建了 5 个进程来执行 worker
函数。每个进程都打印出自己的编号。
需要注意的是,由于 Python 对于全局变量的处理机制,多进程中无法直接共享全局变量。如果多个进程需要共享数据,可以使用 multiprocessing.Manager
创建共享对象。例如,可以创建一个共享列表:
import multiprocessing
def worker(lst, num):
lst.append(num)
if __name__ == '__main__':
manager = multiprocessing.Manager()
lst = manager.list()
for i in range(5):
p = multiprocessing.Process(target=worker, args=(lst, i))
p.start()
p.join()
print(lst)
在这个例子中,我们创建了一个空的共享列表,然后让 5 个进程向里面加入自己的编号。最后输出共享列表。
2. 多线程
多线程是指在同一个进程内,同时执行多个线程。Python 中的多线程是通过 threading 模块实现的。可以通过 threading.Thread
创建线程,并且可以通过 Thread.start()
启动线程,通过 Thread.join()
等待线程结束。
下面是一个使用多线程的例子:
import threading
def worker(num):
print('Worker: %s' % num)
if __name__ == '__main__':
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
t.start()
在这个例子中,我们创建了 5 个线程来执行 worker
函数。每个线程都打印出自己的编号。
需要特别注意的是,在 Python 中,多线程并不能很好地利用多核 CPU 的优势。因为 Python 的 GIL(Global Interpreter Lock) 限制了同一时刻只能有一个线程执行 Python 的字节码。所以说,Python 的多线程只适合 IO 密集型任务,对于 CPU 密集型任务,建议使用多进程。
3. 线程池
3.1 线程池的作用
线程池是一种提高线程效率的方式。具体来说,线程池维护着一个池子,里面有一些线程,这些线程可以被反复利用,执行一些需要使用线程的任务。而不是每次需要使用线程时都重新创建一个线程。
线程池的好处在于,可以减少线程的创建和销毁,提高线程的重用率,从而提高程序的效率。
3.2 使用线程池
Python 中可以使用 ThreadPoolExecutor 类来创建线程池。具体来说,可以通过 ThreadPoolExecutor
的构造函数指定线程池中的线程数量,并且可以通过 submit()
方法向线程池提交任务,并返回一个 Future
对象,这个对象可以用来获取任务的执行结果。
下面是一个使用线程池的例子:
import concurrent.futures
def worker(num):
print('Worker: %s' % num)
return 'Result: %s' % num
if __name__ == '__main__':
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
futures = [executor.submit(worker, i) for i in range(5)]
for future in concurrent.futures.as_completed(futures):
print(future.result())
在这个例子中,我们创建了一个最多可以同时执行 3 个线程的线程池,并且用它来执行 5 个任务。因为线程池只有 3 个线程,所以这 5 个任务不会同时执行,而是分批次执行。
以上就介绍了 Python 中的多进程、多线程和线程池。需要根据具体情况选择适当的方法,才能发挥最大的效果。