详解Python中的进程和线程
什么是进程和线程
- 进程
- 一个进程指的是一个程序运行的实例。每个进程都拥有自己的内存空间、数据栈以及其它系统资源。
- 线程
- 一个线程是进程中的一个执行流,一个进程可以有多个线程同时执行。
Python中的进程和线程
- 进程
- 在Python中,一个进程可以通过
multiprocessing
模块来实现。 multiprocessing
模块提供了一个Process
类,可以用来创建进程。
- 在Python中,一个进程可以通过
- 线程
- 在Python中,线程可以通过
threading
模块来实现。 threading
模块提供了一个Thread
类,可以用来创建线程。
- 在Python中,线程可以通过
以下是一个使用multiprocessing
模块创建进程的示例代码:
import multiprocessing
def worker():
""" 在进程中运行的函数 """
print('Worker')
if __name__ == '__main__':
p = multiprocessing.Process(target=worker)
p.start()
p.join()
以上代码中,我们首先导入multiprocessing
模块。然后定义了一个函数worker
,用于运行在进程中的代码。在if __name__ == '__main__'
下,我们创建了一个Process
对象,并将要执行的函数作为参数传递给了Process
对象。最后,我们调用了Process
对象的start()
方法来启动进程,并调用join()
方法来等待进程执行完毕。
以下是一个使用threading
模块创建线程的示例代码:
import threading
def worker():
""" 在线程中运行的函数 """
print('Worker')
if __name__ == '__main__':
t = threading.Thread(target=worker)
t.start()
以上代码中,我们首先导入了threading
模块。然后定义了一个函数worker
,用于在线程中执行的代码。在if __name__ == '__main__'
下,我们创建了一个Thread
对象,并将要执行的函数作为参数传递给了Thread
对象。最后,我们调用了Thread
对象的start()
方法来启动线程。
进程和线程的区别
- 进程
- 进程是操作系统分配资源的基本单位。
- 每个进程拥有自己独立的内存空间。
- 进程之间的通信通常较为复杂,需要使用
IPC
技术。
- 线程
- 线程是进程中执行的一个流程。
- 线程共享进程的内存空间。
- 线程之间的通信比进程之间的通信更容易。
两者在Python中的差异
- 进程
- 在Python中,多进程可以充分利用多核CPU资源,提高CPU利用率。
- 进程可以通过
os.fork()
系统调用来实现,也可以使用multiprocessing
模块来实现。
- 线程
- 在Python中,
GIL
(全局解释器锁)的存在会限制多线程的并发性,导致多核CPU的利用率并不高。 - 线程可以通过
threading
模块来实现。
- 在Python中,
多线程示例
import threading
import time
def worker():
""" 工作线程 """
print(threading.current_thread().name, 'Starting')
time.sleep(2)
print(threading.current_thread().name, 'Exiting')
def service():
""" 服务线程 """
print(threading.current_thread().name, 'Starting')
time.sleep(3)
print(threading.current_thread().name, 'Exiting')
if __name__ == '__main__':
t1 = threading.Thread(target=worker)
t2 = threading.Thread(target=service)
t1.start()
t2.start()
t1.join()
t2.join()
print('Done')
以上代码中,我们创建了两个线程t1
和t2
,分别执行worker
和service
函数。在if __name__ == '__main__'
下,我们依次启动t1
和t2
线程,并调用join()
方法让主线程等待t1
和t2
线程执行完毕。最后打印Done
表示程序执行完毕。