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!"