进程:操作系统分配内存的一个基本单位,进程之间的内存是相互隔离的,如果进程间要相互通信,要靠一个IPC机制 process
线程:一个进程又可以划分为多个线程,线程是进程的执行单元,也是操作系统分配CPU的基本单元 thread
为什么要使用多进程和多线程?
如果一个任务执行时间很长,就可以分解成多线程或多进程,
提升执行效率,改善程序性能,缩短执行时间
改善用户体验,让用户获得更好的用户体验
进程
multiprocessing
模块提供了一个Process
类来代表一个进程对象
import time from multiprocessing import Process import os count = 0 def output(string): global count while count < 10: print(string, end='', flush=True) count += 1 def main(): p1 = Process(target=output, args=('Ping', )) p1.start() p2 = Process(target=output, args=('Pong',)) p2.start()
多线程
多任务可以由多进程完成,也可以由一个进程内的多线程完成。
我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。
由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。
Python的标准库提供了两个模块:_thread
和threading
,_thread
是低级模块,threading
是高级模块,对_thread
进行了封装。绝大多数情况下,我们只需要使用threading
这个高级模块。
启动一个线程就是把一个函数传入并创建Thread
实例,然后调用start()
开始执行
from threading import Thread count = 0 class PrintThread(Thread): def __init__(self, string, count): super().__init__() self._string = string self._count = count def run(self): for _ in range(self._count): print(self._string, end='', flush=True) def main(): PrintThread('Ping', 10).start() PrintThread('Pong', 10).start()
创建线程的两种方式
1. 直接创建Thread对象并通过target参数指定线程启动后要执行的任务
2. 继承Thread自定义线程 通过重写run方法指定线程启动后执行的任务