多进程与多线程
在大多数场景下面,简单执行单任务就可以完成大部分的任务,但是在一些场景下比如:数据读取、数据加载等情况下,需要同时执行多个任务的情况该怎么去处理呢?
答:
- 多进程模式
- 多线程模式
- 多进程+多线程模式
线程是最小的执行单元,而进程由至少一个线程组成。
多进程
在python中调用进程的方法都在multiprocessing当中
from multiprocessing import Process, Pool
其中Process是开启一个新的进程,而Pool则是开启一个进程池
示例代码如下:
from multiprocessing import Pool
import os, time, random
def multiprocee():
p = Pool(4) # 开启一个长度为4的进程池,允许一次性执行4个函数
for i in range(5):
p.apply_async(run_proc, args=(i,))
print('Waiting for all subprocesses done...')
p.close()
p.join()
def single_proc():
p = Process(run_proc, args=('test', ))
p.start()
p.join()
其中开启单个新进程用Process(target=函数,args=传入的参数)
开启。
p.start()
开始执行进程
p.close()
关闭进程
p.join()
阻塞进程:等待子进程结束后继续运行,常用于子进程间的同步。
多线程
我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。
由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外
Python的标准库提供了两个模块:_thread
和threading
,我们只需要使用threading
这个高级模块。
import threading
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。