进程:操作系统分配内存的一个基本单位,进程之间的内存是相互隔离的,如果进程间要相互通信,要靠一个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的标准库提供了两个模块:_threadthreading_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方法指定线程启动后执行的任务