多线程和多进程是Python多任务处理的两种方式。多线程是同一时间运行多个线程,多进程是同一时间运行多个进程。本文将从以下几个方面对Python多线程和多进程进行详解:
一、线程与进程的概念及区别
线程是进程的一部分,是程序执行的最小单元,每个线程拥有自己的堆栈和局部变量,但它们共享进程的全局变量和内存。一个进程可以有多个线程。
进程是正在运行的应用程序,它拥有自己的地址空间、堆栈、文件句柄和其他资源。一个进程可以包含多个线程,线程间要通过进程来通信。
区别:
- 进程间通信困难,需要使用特定的方法(如IPC);线程间通信简单,使用共享内存或消息传递即可。
- 进程间切换开销较大;线程间切换开销较小。
- 同一个进程的线程之间共享进程的内存,而进程之间的内存是独立的。
- 每个进程都有各自独立的Python解释器进程;线程共享所属进程的Python解释器。
二、Python多线程
1、创建线程
在Python中,创建线程的最简单的方式是使用threading模块的Thread对象。
import threading # 定义一个函数作为线程的执行体 def action(max): for i in range(max): print(threading.current_thread().name + " " + str(i)) # 创建并启动一个线程 threading.Thread(target=action, args=(100,), name='Thread-A').start() # 创建并启动另外一个线程 threading.Thread(target=action, args=(200,), name='Thread-B').start()
2、线程同步
如果多个线程同时访问共享资源,就可能引发竞态条件,导致结果不正确。可使用锁机制来避免线程之间的竞态条件。
import threading # 设置全局变量x和Lock对象 x = 0 lock = threading.Lock() # 线程的执行函数 def add(): global x # 获取资源锁 lock.acquire() for i in range(100000): x += 1 # 释放资源锁 lock.release() # 创建10个线程,启动线程 for j in range(10): threading.Thread(target=add).start() # 等待所有线程执行完毕 for th in threading.enumerate(): if th != threading.currentThread(): th.join() print(x) # 输出结果为1000000
三、Python多进程
1、创建进程
可以使用multiprocessing模块的Process对象来创建进程。
import multiprocessing # 子进程执行函数 def worker(): print("I'm process {0}, my parent is {1}".format(multiprocessing.current_process().pid, multiprocessing.current_process().name)) # 创建并启动子进程 processes = [] for i in range(5): process = multiprocessing.Process(target=worker) processes.append(process) process.start() # 等待所有进程执行完毕 for process in processes: process.join()
2、进程池
如果需要同时启动多个子进程,可以使用进程池。
import multiprocessing # 子进程执行函数 def worker(num): print("Worker {0} is running".format(num)) # 创建进程池 pool = multiprocessing.Pool(processes=3) # 启动10个子进程 for i in range(10): pool.apply_async(worker, args=(i, )) # 关闭进程池。关闭进程池之后不能再向其中添加新的任务。 pool.close() # 等待所有子进程执行完毕 pool.join()
四、总结
Python的多线程和多进程,都可以很好地发挥多核CPU的性能优势,提高程序执行效率。但需要注意线程同步和进程间通信的问题,避免线程间竞态条件和进程间数据冲突,保证程序执行正确性。