进程

进程:

  什么是进程

    进程指的是一个程序的运行过程,或者说一个正在执行的程序
所以说进程一种虚拟的概念,该虚拟概念起源操作系统
串行: 一个任务完完整整运行完毕才能执行下一个任务
并发: 多个任务看起来是同时运行的,单核下就能实现并发(并发=切换+保存状态)
并行: 多个任务是真正意义上的同时运行,只有多核才能实行并行

开启子进程的俩种方式
from multiprocessing import Process
import time

def task(name):
    print('%s is running' %name)
    time.sleep(3)
    print('%s is done' %name)

# 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中
if __name__ == '__main__':
    p=Process(target=task,args=('egon',))     
    #或者这样写Process(target=task,kwargs={'name':'egon'})
    p.start() # 只是向操作系统发送了一个开启子进程的信号
    print('')

结果:
主
egon is running
egon is done
第一种
from multiprocessing import Process
import time

class Myprocess(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name

    def run(self):
        print('%s is running' %self.name)
        time.sleep(3)
        print('%s is done' %self.name)

# 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中
if __name__ == '__main__':
    p=Myprocess('egon')
    p.start() # 只是向操作系统发送了一个开启子进程的信号
    print('')

结果:
主
egon is running
egon is done
第二种
join:让主进程在原地等待,等待子进程运行完毕,不会影响子进程的执行
from multiprocessing import Process
import time

def task(name,n):
    print('%s is running' %name)
    time.sleep(n)
    print('%s is done' %name)

if __name__ == '__main__':
    p1=Process(target=task,args=('子1',1))
    p2=Process(target=task,args=('子2',2))
    p3=Process(target=task,args=('子3',3))
#第一种
    start=time.time()
    p1.start()
    p2.start()
    p3.start()
    time.sleep(5)

    p3.join() #3
    p1.join()
    p2.join()
    print('',(time.time()-start))
#第二种
    start=time.time()
    p_l=[]
    for i in range(1,4):
        p = Process(target=task, args=('子%s' %i, i))
        p_l.append(p)
        p.start()

    for p in p_l:
        p.join()
    print('', (time.time() - start))
结果:
子2 is running
子1 is running
子3 is running
子1 is done
子2 is done
子3 is done
主 5.143582582473755
举例

进程之间内存空间相互隔离

from multiprocessing import Process
n=100
def task():
    global n
    n=0
#子进程
# if __name__ == '__main__':
#     p=Process(target=task)
#     p.start()
#     p.join()
#     print(n)
结果:100

#主进程
task()
print(n)
结果:0
举例
进程pid:每一个进程在操作系统内都有一个唯一的id号,称之为pid
from multiprocessing import Process,current_process
import time

def task():
    print('%s is running' %current_process().pid)
    time.sleep(10)
    print('%s is done' %current_process().pid)

if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    print('',current_process().pid)
#可以在cmd中使用tasklist |findstr 进程号 看到
结果:
主 11956
11660 is running
11660 is done
进程pid
进程对象其他相关的属性或方法
from multiprocessing import Process
import time,os

def task():
    print('%s is running 爹是:%s' %(os.getpid(),os.getppid()))
    time.sleep(5)
    print('%s is done 爹是:%s' %(os.getpid(),os.getppid()))


if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    print('主:%s 主他爹:%s' %(os.getpid(),os.getppid()))
结果:
主:11508 主他爹:4920
9928 is running 爹是:11508
9928 is done 爹是:11508
getppid
from multiprocessing import Process,current_process
import time,os

def task():
    print('%s is running 爹是:%s' %(os.getpid(),os.getppid()))
    time.sleep(10)
    print('%s is done 爹是:%s' %(os.getpid(),os.getppid()))

if __name__ == '__main__':
    p=Process(target=task,name='子进程1')
    p.start()
    print(p.name)
    p.terminate()  #杀死子进程
    time.sleep(0.1)
    print(p.is_alive())  #判断是否还在运行
    print('主:%s 主他爹:%s' %(os.getpid(),os.getppid()))
结果:
子进程1
False
主:10948 主他爹:4920
terminate和is_alive
原文地址:https://www.cnblogs.com/zhouhao123/p/11247968.html