py 多进程,多线程,线进池

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 中的多进程、多线程和线程池。需要根据具体情况选择适当的方法,才能发挥最大的效果。

后端开发标签