实例1
# coding=utf-8
from multiprocessing import Process
import os
"""
多进程中,每个进程中所有数据(包括全局变量)都各有拥有一份,互不影响
父进程、子进程执行顺序没有规律,完全取决于操作系统的调度算法
Process([group [, target [, name [, args [, kwargs]]]]])
target:表示这个进程实例所调用对象;
args:表示调用对象的位置参数元组;
kwargs:表示调用对象的关键字参数字典;
name:为当前进程实例的别名;
group:大多数情况下用不到;
Process类常用方法:
is_alive():判断进程实例是否还在执行;
join([timeout]):是否等待进程实例执行结束,或等待多少秒;
start():启动进程实例(创建子进程);
run():如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;
terminate():不管任务是否完成,立即终止;
Process类常用属性:
name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数;
pid:当前进程实例的PID值;
"""
# 子进程要执行的代码
def run_proc(name):
print('子进程运行中,name= %s ,pid=%d...' % (name, os.getpid()))
if __name__ == '__main__':
print('父进程 %d.' % os.getpid())
p = Process(target=run_proc, args=('test',))
print('子进程将要执行')
p.start() # 启动
p.join() # 等待子进程结束后再继续往下运行,通常用于进程间的同步。
print('子进程已结束')
实例2
# coding=utf-8
from multiprocessing import Process
import time
import os
# 两个子进程将会调用的两个方法
def worker_1(interval):
print("worker_1,父进程(%s),当前进程(%s)" % (os.getppid(), os.getpid()))
t_start = time.time()
time.sleep(interval) # 程序将会被挂起interval秒
t_end = time.time()
print("worker_1,执行时间为'%0.2f'秒" % (t_end - t_start))
def worker_2(interval):
print("worker_2,父进程(%s),当前进程(%s)" % (os.getppid(), os.getpid()))
t_start = time.time()
time.sleep(interval)
t_end = time.time()
print("worker_2,执行时间为'%0.2f'秒" % (t_end - t_start))
def main():
print("进程ID:%s" % os.getpid()) # 输出当前程序的ID
p1 = Process(target=worker_1, args=(2,))
p2 = Process(target=worker_2, name="进程2", args=(1,)) # 如果不指定name参数,默认的进程对象名称为Process-N,N为一个递增的整数
p1.start()
p2.start()
print("p2.is_alive:%s" % p2.is_alive()) # 同时父进程仍然往下执行,如果p2进程还在执行,将会返回True
# 输出p1和p2进程的别名和pid
print("p1.name=%s" % p1.name)
print("p1.pid=%s" % p1.pid)
print("p2.name=%s" % p2.name)
print("p2.pid=%s" % p2.pid)
# join括号中不携带参数,表示父进程在这个位置要等待p1进程执行完成后,
# 再继续执行下面的语句,一般用于进程间的数据同步,
# 如果不写这一句,下面的is_alive判断将会是True,
# 在shell(cmd)里面调用这个程序时,可以完整的看到这个过程
p1.join()
print("p1.is_alive=%s" % p1.is_alive())
if __name__ == '__main__':
main()