熟练的使用多进程的模型来编程,是一个coder的很重要的能力。下面来讨论一下python语言描述的多线程。
下面是一个python的单进程的例子
from time import sleep,ctime
from multiprocessing import Process
def loop0():
print ('start loop0 at : ',ctime())
sleep(4)
print ('loop0 end at : ',ctime())
def loop1():
print ('start loop1 at : ',ctime())
sleep(2)
print ('loop1 end at : ',ctime())
def SingleProcess():
print ('start at : ',ctime())
loop0()
loop1()
print ('all Done at :',ctime())
那么程序运行的结果是:
程序运行6s
如果将程序改成多进程的模型:
from time import sleep,ctime
from multiprocessing import Process
def loop0():
print ('start loop0 at : ',ctime())
sleep(4)
print ('loop0 end at : ',ctime())
def loop1():
print ('start loop1 at : ',ctime())
sleep(2)
print ('loop1 end at : ',ctime())
def SingleProcess():
print ('start at : ',ctime())
loop0()
loop1()
print ('all Done at :',ctime())
if __name__=='__main__':
print ('start at : ',ctime())
p1=Process(target=loop0)
p2=Process(target=loop1)
p1.start()
p2.start()
p1.join()
p2.join()
print ("end at : ",ctime())
相当于常见两个进程,一个执行loop0,一个执行loop1,那么程序的运行结果是:
程序运行4s
为什么这样呢?
因为两个进程并发了
这是并发的定义
并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,
且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
所以,程序原来的模型是
loop0 执行完之后 loop1再执行,loop0启动之后,休眠4s,在休眠的时候,操作系统会进行进程调度,比如执行其他的进程。那么其他的进程是什么呢?
这些都是系统上跑的进程。linux会按照自己的规则进行进程调度。也就是说在执行loop0的时候,它休眠4s,那么这时候,会发生进程调度。cpu转去执行其他的进程。4s之后,loop0唤醒,加入到就绪队列,重新获得cpu,然后继续执行loop1。所以程序需要执行6s。
在多线程的模型下,启动一个进程去执行loop0,同时还会创建一个进程去执行loop1。在loop0休眠4s的时候,loop1会获得cpu,执行自己的程序。所以,loop0 和loop1是平行的关系。
所以,程序需要执行4s。
PS: 这边文章说的是进程的事情,没有谈线程,不要搞混了。