进程和线程都是CPU运行的上下文

关于进程和线程,Linus提到了一个运行上下文的概念(context of execution): 原文

Both threads and processes are really just one thing: a "context of execution".
Trying to artificially distinguish different cases is justself-limiting.

对于操作系统开发者而言,无论进程还是线程,都是运行上下文.这一概念有助于我们对操作系统的理解.

Different COE's can share parts of their context with each other,
and one _subset_ of that sharing is thetraditional "thread"/"process" setup, ...

进程,线程这一机制是上下文共享机制的实现方式之一.

进程和线程的粒度不同

关于进程,线程,教科书式的定义是:

操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位
  1. 进程作为分配资源的基本单位

什么是资源呢,就是内存,文件,socket等,比如你new了一块内存, 就是操作系统将一块物理内存映射到你的进程地址空间上,这块内存就是属于你这个进程的, 你进程内的所有线程都可以访问这块内存,其他进程就访问不了。其他类型的资源也是同理。 所以进程是分配资源的基本单位(而不是线程,因为同一个进程内的所有线程都可以访问这些资源)

  1. 线程作为独立运行和独立调度的基本单位

进程的颗粒度太大,每次都要有上下的调入,保存,调出。 如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的, 必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。 这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有进行上下文切换的。 这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境的更为细小的CPU时间段

协程

协程是人为的利用单线程在操作某任务等待空闲的时间内,通过yield保存当时的状态, 用该线程做其他的操作,由此实现并发. 协程的一些特征:用户控制切换,自动保存上下文状态,切换之间可以通过参数通信,可用同步的方式实现异步

Use Process & Threading in Python

  • from multiprocessing import Pool: use multi processes
  • from multiprocessing.dummy import Pool: use multi threads
# from multiprocessing import Pool
from multiprocessing.dummy import Pool
import urllib2

urls = [
    'http://www.google.com',
    'http://www.facebook.com'
]
pool = ThreadPool(8)
results = pool.map(urllib2.urlopen, urls)
pool.close()
pool.join()