目录
1 使用multiprocessing模块创建线程
from multiprocessing import Process
import time
import os
def child_2(interval):
print("子进程(%s)开始执行,父进程为(%s)"%(os.getpid(),os.getppid()))
t_start=time.time()
time.sleep(interval)
t_end = time.time()
print("子进程(%s)执行的时间是‘%0.2f’秒"%(os.getpid(),t_end-t_start))
def child_1(interval):
print("子进程(%s)开始执行,父进程为(%s)"%(os.getpid(),os.getppid()))
t_start=time.time()
time.sleep(interval)
t_end = time.time()
print("子进程(%s)执行的时间是‘%0.2f’秒"%(os.getpid(),t_end-t_start))
def main():
print('主进程开始')
print("主进程pid(%s)"%(os.getpid()))
p1 = Process(target=child_1,args=(1,))
p2 = Process(target=child_2, name="myname",args=(2,))
#同时执行两个人进程
p1.start()
p2.start()
print("p1_is_alive(%s)"%p1.is_alive())
print("p2_is_alive(%s)"%p2.is_alive())
#输出p1p2的别名和pid
print("p1的别名%s"%p1.name)
print("p1的别名%s"%p2.name)
print("等待进程结束")
p1.join()
p2.join()
print('主进程结束')
if __name__=='__main__':
main()
执行结果如下:
D:\py测试\venv\Scripts\python.exe D:/py测试/main.py
主进程开始
主进程pid(17872)
p1_is_alive(True)
p2_is_alive(True)
p1的别名Process-1
p1的别名myname
等待进程结束
子进程(12716)开始执行,父进程为(17872)
子进程(6880)开始执行,父进程为(17872)
子进程(12716)执行的时间是‘1.00’秒
子进程(6880)执行的时间是‘2.02’秒
主进程结束
2 使用Process的子类创建进程
一般的进程可以使用Process(target=obj)来创建,对于复杂任务可以创建Process的子类来创建进程
from multiprocessing import Process
import time
import os
class Subprocess(Process):
def __init__(self,interval,name=''):
Process.__init__(self)
self.interval = interval
if name: #判断传递的参数name是否存在
self.name=name
def run(self):
print("子进程(%s)开始执行,父进程为(%s)"%(os.getpid(),os.getppid()))
t_start=time.time()
time.sleep(self.interval)
t_end=time.time()
print("子进程%s执行结束,使用时间%0.2f秒"%(os.getpid(),t_end-t_start))
def main():
print('主进程开始')
print("主进程pid(%s)"%(os.getpid()))
p1 = Subprocess(interval=1,name="mytset")
p2 = Subprocess(interval=2)
#同时执行两个人进程
p1.start()
p2.start()
print("p1_is_alive(%s)"%p1.is_alive())
print("p2_is_alive(%s)"%p2.is_alive())
#输出p1p2的别名和pid
print("p1的别名%s"%p1.name)
print("p1的别名%s"%p2.name)
print("等待进程结束")
p1.join()
p2.join()
print('主进程结束')
if __name__=='__main__':
main()
执行结果如下
D:\py测试\venv\Scripts\python.exe D:/py测试/main.py
主进程开始
主进程pid(4052)
p1_is_alive(True)
p2_is_alive(True)
p1的别名mytset
p1的别名Subprocess-2
等待进程结束
子进程(3436)开始执行,父进程为(4052)
子进程(18600)开始执行,父进程为(4052)
子进程3436执行结束,使用时间1.01秒
子进程18600执行结束,使用时间2.01秒
主进程结束
Process finished with exit code 0
3 使用进程池创建进程
不用实例化,直接调用函数名进行
from multiprocessing import Process
from multiprocessing import Pool
import time
import os
def task(name):
print('子进程(%s)执行task%s...'%(os.getpid(),name))
time.sleep(1)
def main():
print('主进程开始')
print("主进程pid(%s)"%(os.getpid()))
p = Pool(3) #定义一个进程池,最大进程数是3
for i in range(10): #从0开始循环10次
p.apply_async(task,args=(i,))
print("等待所有子进程结束。。。。")
p.close() #关闭线程池,关闭后p将不再接受新的请求
p.join()
print('主进程结束')
if __name__=='__main__':
main()
执行结果如下:
可以看到只有三个进程在运行
D:\py测试\venv\Scripts\python.exe D:/py测试/main.py
主进程开始
主进程pid(3528)
等待所有子进程结束。。。。
子进程(19016)执行task0...
子进程(6628)执行task1...
子进程(15612)执行task2...
子进程(19016)执行task3...
子进程(15612)执行task4...
子进程(6628)执行task5...
子进程(19016)执行task6...
子进程(6628)执行task7...
子进程(15612)执行task8...
子进程(19016)执行task9...
主进程结束
Process finished with exit code 0
4 应用队列进行进程之间消息传递
from multiprocessing import Process
from multiprocessing import Queue
from multiprocessing import Pool
import time
import os
def write_task(q):
if not q.full():
for i in range(5):
message="消息"+str(i)
q.put(message)
print("写入消息%s"%message)
def read_task(q):
time.sleep(1)
while not q.empty():
print("读取%s"% q.get(True,2))#等待2秒如果还没有消息则抛出异常
def main():
print('主进程开始')
print("主进程pid(%s)"%(os.getpid()))
q = Queue()
pw = Process(target=write_task,args=(q,))
pr = Process(target=read_task,args=(q,))
print("启动子进程")
pw.start()
pr.start()
print("等待所有子进程结束。。。。")
pw.join()
pr.join()
print('主进程结束')
if __name__=='__main__':
main()
运行结果如下
主进程开始
主进程pid(1924)
启动子进程
等待所有子进程结束。。。。
写入消息消息0
写入消息消息1
写入消息消息2
写入消息消息3
写入消息消息4
读取消息0
读取消息1
读取消息2
读取消息3
读取消息4
主进程结束