1、    进程定义:

(1) 进程是一个实体。每个进程都有他自己的地址空间,一般包括文本区域、数据区域和堆栈。进程是线程的容器。

(2) 进程是一个“执行中的程序”

2、    进程的特征:

(1) 动态性

(2) 并发性

(3) 独立性

(4) 异步性:同步:顺序执行,不可跳跃  异步:并行

(5) 结构特征:进程由程序、数据和进程控制块(PCB,存进程相关的信息,比如进程ID,父ID,状态)三部分组成

(6) 多个不同的进程可以包含相同的程序

3、    CPU组成:运算器、控制器和寄存器

4、    进程切换:从正在运行的进程中收回处理器,然后再使待运行进程来占用处理器

5、    进程的上下文:进程切换时被存储在寄存器中打包的中间数据

6、    进程运行状态:

(1) 就绪状态

(2) 运行状态

(3) 阻塞状态:由于进程等待某种条件(如 I/O 操作或进程同步),在条件未满足之前无法执行

7、    分库、分秒、分布式计算、分布式索引、异步进程

8、    同步、异步、阻塞、非阻塞

9、    程序计数器:program counter 程序运行到哪一行

10、   Python中一些进程模块

(1) os.fork()

(2) subprocess

(3) processing

(4) Multiprocessing

11、   os.fork()

在Linux中,执行fork函数后,父进程拿到的fork函数返回值是子进程的pid,子进程拿到的fork函数返回值是0,父进程和子进程会分别执行后续未执行的代码.换了意思:子进程永远返回0,而父进程返回子进程的ID。

12、    进程池pool的一些方法:

(1) apply()

(2) map()

(3) close()

(4) terminate()

(5) apply_async()只能执行一个

13、    线程比进程快的原因:线程依附于进程,但他快的原因是不不涉及到上下文PCB那些东西

14、    Pool.map和六件客map的区别:pool.map用的是多进程,map是单进程

15、    队列:Queue,此队列跟进程中的消息队列不同

Q.put()

Q.full()判断队列是否满了

Q.qsize()判断队列的大小

Q.empty()判断队列是否为空

Q.get(True,2)等待超时时间2秒,设置True后如果等待2秒后还没有数值返回就结束;False表示等2秒后如果没有值抛异常;如果什么都不写,会死等

调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常

 

 

#练习:最简单的多进程模型

import multiprocessing
def do(n) :
  #获取当前线程的名字
  name = multiprocessing.current_process().name
  print name,'starting'
  print "worker ", n
  return 

if __name__ == '__main__' :
  numList = []
  for i in xrange(5) :
    p = multiprocessing.Process(target=do, args=(i,))
    numList.append(p)
    p.start()
    p.join()
    print "Process end."
  print numList



#练习:三个进程,每个进程写一个文件,每个文件中有进程的名字和当前日期

import time
import multiprocessing
import os

def write(file):
    name=multiprocessing.current_process().name
    with open(file,"w") as f:
        f.write(name+":"+time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
    return

if __name__=="__main__":
    for i in range(3):
        file_path = os.path.join("e:\\test4",str(i)+".txt")
        p = multiprocessing.Process(target=write, args=(file_path,))  #参数是个元组,所以必须有个逗号
        p.start()
        p.join()


#练习:多进程模板
import multiprocessing
import urllib2 
import time

def func1(url) :
  response = urllib2.urlopen(url) 
  html = response.read()
  print html[0:50]
  time.sleep(2) 

def func2(url) :
  response = urllib2.urlopen(url) 
  html = response.read()
  print html[0:50]
  time.sleep(2)

 
if __name__ == '__main__' :
    p1 = multiprocessing.Process(target=func1,args=("http://www.sogou.com",),name="g1")
    p2 = multiprocessing.Process(target=func2,args=("http://www.baidu.com",),name="g2")
    p1.start()
    p2.start()
    p1.join()  #加了join是等所有子进程都执行完后才会打印done,如果不加join,会先打印done,但子进程依然会执行
    p2.join()
    time.sleep(2)
    print "done!"