详解Python中的进程和线程

  • Post category:Python

详解Python中的进程和线程

什么是进程和线程

  • 进程
    • 一个进程指的是一个程序运行的实例。每个进程都拥有自己的内存空间、数据栈以及其它系统资源。
  • 线程
    • 一个线程是进程中的一个执行流,一个进程可以有多个线程同时执行。

Python中的进程和线程

  • 进程
    • 在Python中,一个进程可以通过multiprocessing模块来实现。
    • multiprocessing模块提供了一个Process类,可以用来创建进程。
  • 线程
    • 在Python中,线程可以通过threading模块来实现。
    • threading模块提供了一个Thread类,可以用来创建线程。

以下是一个使用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模块来实现。

多线程示例

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')

以上代码中,我们创建了两个线程t1t2,分别执行workerservice函数。在if __name__ == '__main__'下,我们依次启动t1t2线程,并调用join()方法让主线程等待t1t2线程执行完毕。最后打印Done表示程序执行完毕。