本文主要介绍如何使用multiprocessing.

一、线程与进程

首先需要铺垫一下,下面先介绍线程与进程的区别,接着说Python下使用线程的缺陷。

1. 区别

首先复习一下线程(threading)与进程(process)。首先得说进程,进程是资源分配的基本单位——一个进程,计算机分配一个对应的虚拟内存空间(从进程的角度来看,它占据了整个计算机的内存资源,根本不存在其他进程)。 线程是附属于进程的,同一个进程内可以有多个线程 ,同个进程下的多个线程间共享内存——他们都在线程得到的这块内存空间里面。进程切换需要用户态与内核态的切换,而线程切换,在用户态就可以完成。当时在操作系统课上,甚至看到线程就是goto跳到另有一个函数里去了(记不清了,正规的说,是有栈的切换的)。

线程与进程的切换开销,这里我们并不关心(不影响正确性)。我们在基础编程中最需要注意的事情,是需要记住这个事实——线程可以通过全局变量共享内存,进程可完全不可能! 各进程间是完全独立的——他们各自有各自完整的虚拟内存空间,在用户态是根本不可能直接内存共享的!

进程不能通过定义全局变量来共享内存(包括Python,其中的dict,list等reference型的类型,通通都不行),这点我总是记不住!

进程间要想共享信息,通常有以下途径:

  1. 共享内存(本质mmap系统调用)
  2. 队列
  3. 管道(有名、匿名)
  4. 信号量
  5. 文件,Sockets

对于进程和线程的区别,因为年代相对久远,自己已经差不多全忘了。上面主要都摘抄自Linux进程与线程的区别。不保证上面论述都是准确的,如有错误,请指正。

2. GIL让Python的线程存在较大局限

Python中的进程通信