【python】多进程的概念及应用

一.什么是进程?---运行的一个程序,资源分配的最小单位,线程是调度的最小单位
包括程序本身,数据,执行的指令
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
在早期面向进程设计的计算机结构中,进程是程序的基本执行实体,在当代面向线程设计的计算机结构中, 进程是线程的容器
程序是指令,数据及其组织形式的描述, 进程是程序的实体

进程:操作系统中分配资源的最小单位,比如QQ,word(运行中)就是一个进程
计算机中的一个程序,数据,运行 ps-ef
线程:操作系统调度的最小单位,cpu执行的都是线程

狭义定义:进程是正在运行的程序的实例
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
它是操作
进程的状态:创建,就绪,运行,阻塞,结束
就绪:可被执行的状态
阻塞状态:等待io ,返回等状态的返回
cpu:

进程的概念主要有两点:
第一,进程是个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域( text regiontext region text region text region)、数据区域( data region data regiondata region data region)和堆栈( stack regionstack region stack regionstack region stack region)。文 本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用动态分配的内存,堆栈区域存储着活动过程调用的指令和本地变量。

第二,进程是一个“执行中的序”。程序是一个没有生命实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其进程。

进程是操作系统中最基本、重要的概念。多任务出现后,为了刻画内部出现的动态情况,描述系统内部各程序活规律引进一个概念 ,所有多任务设 计操作系统都建立在进程的基础上。

问题:一个CPU,开100个并发,多线程执行一个任务,有意义吗?
(1)纯计算密集型,不需要网络io,不需要磁盘io,不需要延迟,阻塞的情况,开一个线程要快
多个线程的情况下需要线程下的切换会产生延迟,一个cpu同一时间只能运行一个线程,建议用单线程压测
(2)有大量io 的情况下,多线程,多进程就会有意义,提高CPU的利用率,在写数据的时候切换到别的线程,执行别的线程,建议用多线程压测

二.进程的特征:
1.名词解释:
同步:顺序执行,步骤不可跳跃
异步:并行
动态性:进程的实质是程序在多任务系统中一次执行过程,进程是动态产 生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度 的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程具有执行的间断姓,即按各自 独立的、不可预知速度执行
结构特征: 进程由程序、数据和控制块三部分组成。
多个不 同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过中,程序不能发生改变。

三.CPU的组成
CPU由运算器,控制器和寄存器组成。运算器是对数据进行加工处理的部件。他不仅可以实现基本的算术运算,还可以进行基本的逻辑运算,实现逻辑判断的比较及数据传递,移位等操作。
控制器是负责从存储器中取出指令,确定指令类型及译码,按时间的先后顺序向其他部件发出控制信号,统一指挥和协调计算器各器件进行工作的部件。
寄存器是CPU内部高速独立的暂时存储单元。
cpu在同一时刻只能有一个线程在执行

四.进程切换
进行
进程切换 就是从正在运行的进程中收回处理器,然后再使待运行进程来占用处理器。
进程的上下文:记录运行的状态和数据,程序运行的中间状态

五.进程的运行状态
就绪,运行,
阻塞:由于进程等待某种条件,在条件满足之前无法继续执行,该事件发生前及时把处理机分配给该进程,也无法运行


在linux中,执行fork函数之后
父进程拿到的返回的fork函数返回值是子进程的pid
子进程拿到的返回的fork函数返回值是0
父进程和子进程会分别执行后续未执行的代码


六.cpu的组成
运算器,控制器,寄存器

七.名词
原语:最小的指令集,不可再分割
事物(loadrunner):算时间耗时

十一.os.fork()
#!/user/bin/python
#encoding=utf-8
import os
print os.getpid()

pid = os.fork() # 创建一个子进程
print pid #子进程id和0
if pid == 0:
print 'I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())
else:
print 'I (%s) just created a child process (%s).' % (os.getpid(), pid)
在linux中,执行fork函数之后
父进程拿到的返回的fork函数返回值是子进程的pid
子进程拿到的返回的fork函数返回值是0
父进程和子进程会分别执行后续未执行的代码

十二.创建进程
#coding=utf-8
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 os
import time
import multiprocessing

def do(filepath):
name=multiprocessing.current_process().name
with open(filepath,"w") as fp:
fp.write(name+"\n")
fp.write(str(os.getpid())+"\n"+time.strftime("%Y-%m-%d %H:%M:%S")+"\n")
if __name__=="__main__":
filepath="e:\\abc\\abc"
for i in range(3):
p=multiprocessing.Process(target=do,args=(filepath+"\\"+str(i)+".txt",))
p.start()
p.join()
print "end"


十三.多进程模板程序
#coding=utf-8
import multiprocessing
import urllib2 
import time

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

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

 
if __name__ == '__main__' :
    p1 = multiprocessing.Process(target=func1,args=("http://www.sogou.com",),name="gloryroad1")
    p2 = multiprocessing.Process(target=func2,args=("http://www.baidu.com",),name="gloryroad2")
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    time.sleep(10)
    print "done!"

线程切换快还是进程切换快?
线程,因为线程切换不用切换上下文



猜你喜欢

转载自blog.csdn.net/qq_30758629/article/details/80998985