进程的创建
2018-04-27 本文已影响0人
furuiyang
进程的创建-multiprocessing
multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。
两个while循环一起执行的代码实现
from multiprocessing import Process
import time
def run_proc():
'''子进程要执行的代码'''
while True:
print("---2---")
time.sleep(1)
if __name__ == '__main__':
p = Process(target=run_proc)
p.start()
while True:
print("---1---")
time.sleep(1)
代码说明
创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动
进程pid
import multiprocessing
import os
import time
def run_proc():
# os.getpid() 取得当前进程的id
# os.getppid() :取得当前进程的父进程的id
while True:
time.sleep(1)
print()
print("--run_proc--子进程的父进程的id=%d 子进程的id= %d" % (os.getppid(), os.getpid()))
if __name__ == '__main__':
print("--main--主进程的父进程id=%d 主进程的id= %d" % (os.getppid(), os.getpid()))
p1 = multiprocessing.Process(target=run_proc)
p1.start()
进程id.png
Process语法结构如下
Process([group [, target [, name [, args [, kwargs]]]]])
target:如果传递了函数的引用,可以认为这个子进程就执行这里的代码
args:给target指定的函数传递的参数,以元组的方式传递
kwargs:给target指定的函数传递命名参数
name:给进程设定一个名字,可以不设定
group:指定进程组,大多数情况下用不到
Process创建的实例对象的常用方法:
start():启动子进程实例(创建子进程)
is_alive():判断进程子进程是否还在活着
join([timeout]):是否等待子进程执行结束,或等待多少秒
join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。
terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:
name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
pid:当前进程的pid(进程号)
给子进程指定的函数传递参数
# coding:utf-8
from multiprocessing import Process
import os
from time import sleep
def run_proc(name,age,**kwargs):
for i in range(10):
print('子进程运行中,name= %s,age=%d ,pid=%d...' % (name, age, os.getpid()))
print(kwargs)
sleep(0.2)
if __name__ == '__main__':
p = Process(target=run_proc,args=('test',18),kwargs={"m":20})
p.start()
sleep(1) # 1s之后 立即结束子进程
p.terminate()
p.join()
运行结果
进程传参运行结果.png进程之间不同享全局变量
# coding:utf-8
from multiprocessing import Process
import os
import time
nums = [11,22]
def work1():
print('in process1 pid=%d,nums=%s' %(os.getpid(),nums))
for i in range(3):
nums.append(i)
time.sleep(1)
print('in process1 pid=%d,nums=%s' %(os.getpid(),nums))
def work2():
print('in process2 pid=%d,nums=%s'%(os.getpid(),nums))
if __name__ == '__main__':
p1 = Process(target=work1)
p1.start()
p1.join()
p2 = Process(target=work2)
p2.start()
运行结果:
/home/python/.virtualenvs/django_py3/bin/python /home/python/Desktop/demo/process_demo/demo004.py
in process1 pid=15096,nums=[11, 22]
in process1 pid=15096,nums=[11, 22, 0]
in process1 pid=15096,nums=[11, 22, 0, 1]
in process1 pid=15096,nums=[11, 22, 0, 1, 2]
in process2 pid=15102,nums=[11, 22]
Process finished with exit code 0