python创建进程

目录

1 使用multiprocessing模块创建线程

执行结果如下:

2 使用Process的子类创建进程

执行结果如下

3 使用进程池创建进程

执行结果如下:

 4 应用队列进行进程之间消息传递

运行结果如下




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
主进程结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值