创建进程的类
Process([group [, target [, name [, args [, kwargs]]]]])
#由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)
# group参数未使用,值始终为None
# target表示调用对象,即子进程要执行的任务
# args表示调用对象的位置参数元组,args=(1,2,anne,) 传给target函数的位置参数,是一个元组形式,必须有逗号
# kwargs表示调用对象的字典,kwargs={name:anne,age:18}
# name为子进程的名称
Process属性方法介绍
start() |
启动进程,调用进程中的run()方法。 |
run() |
进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法 。 |
terminate() |
强制终止进程,不会进行任何清理操作。如果该进程终止前,创建了子进程,那么该子进程在其强制结束后变为僵尸进程;如果该进程还保存了一个锁那么也将不会被释放,进而导致死锁。使用时,要注意。 |
is_alive() |
判断某进程是否存活,存活返回True,否则False。 |
join([timeout]) |
主线程等待子线程终止。timeout为可选择超时时间;需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 。 |
daemon |
默认值为False,如果设置为True,代表该进程为后台守护进程;当该进程的父进程终止时,该进程也随之终止;并且设置为True后,该进程不能创建子进程,设置该属性必须在start()之前 |
name |
进程名称。 |
pid |
进程pid |
exitcode |
进程运行时为None,如果为-N,表示被信号N结束了。 |
authkey |
进程身份验证,默认是由os.urandom()随机生成32字符的字符串。这个键的用途是设计涉及网络连接的底层进程间的通信提供安全性,这类连接只有在具有相同身份验证才能成功。 |
方法/属性 |
说明 |
方式一: os.fork()
# -*- coding:utf-8 -*-
"""
pid=os.fork()
1.只用在Unix系统中有效,Windows系统中无效
2.fork函数调用一次,返回两次:在父进程中返回值为子进程id,在子进程中返回值为0
"""
import os
pid=os.fork()
if pid==0:
print("执行子进程,子进程pid={pid},父进程ppid={ppid}".format(pid=os.getpid(),ppid=os.getppid()))
else:
print("执行父进程,子进程pid={pid},父进程ppid={ppid}".format(pid=pid,ppid=os.getpid()))
方式二: 使用multiprocessing模块: 创建Process的实例,传入任务执行函数作为参数
# -*- coding:utf-8 -*-
"""
Process常用属性与方法:
name:进程名
pid:进程id
run(),自定义子类时覆写
start(),开启进程
join(timeout=None),阻塞进程
terminate(),终止进程
is_alive(),判断进程是否存活
想要学习Python?Python学习交流群:1004391443满足你的需求,资料都已经上传群文件,可以自行下载!
"""
import os,time
from multiprocessing import Process
def worker():
print("子进程执行中>>> pid={0},ppid={1}".format(os.getpid(),os.getppid()))
time.sleep(2)
print("子进程终止>>> pid={0}".format(os.getpid()))
def main():
print("主进程执行中>>> pid={0}".format(os.getpid()))
ps=[]
# 创建子进程实例
for i in range(2):
p=Process(target=worker,name="worker"+str(i),args=())
ps.append(p)
# 开启进程
for i in range(2):
ps[i].start()
# 阻塞进程
for i in range(2):
ps[i].join()
print("主进程终止")
if __name__ == "__main__":
main()
方式三: 使用进程池Pool
# -*- coding:utf-8 -*-
import os,time
from multiprocessing import Pool
def worker(arg):
print("子进程开始执行>>> pid={},ppid={},编号{}".format(os.getpid(),os.getppid(),arg))
time.sleep(0.5)
print("子进程终止>>> pid={},ppid={},编号{}".format(os.getpid(),os.getppid(),arg))
def main():
print("主进程开始执行>>> pid={}".format(os.getpid()))
ps=Pool(5)
for i in range(10):
# ps.apply(worker,args=(i,)) # 同步执行
ps.apply_async(worker,args=(i,)) # 异步执行
# 关闭进程池,停止接受其它进程
ps.close()
# 阻塞进程
ps.join()
print("主进程终止")
if __name__ == "__main__":
main()