进程

单任务现象

一个项目中,程序都是在主函数下一步一步执行的,这种现象称为单进程
import  time
def run():
    while True:
        print('子进程进行中')
        time.sleep(1.2)
if __name__ == '__main__':
    while True:
        print("主进程进行中")
        time.sleep(1)
    run()

主程序和run 不会同时执行

启动进程多任务

multiprocessing 库

该库是跨平台的多进程模块,提供了Processs类来代表了一个进程对象
from multiprocessing import Process
import time
import os
def run(str):
    while True:
        x = os.getpid()   #获取当前进程pid
        y = os.getppid()  #获取当前父进程的pid
        print(x)
        print(y)
        print('子进程进行中'+str)
        time.sleep(1.2)
if __name__ == '__main__':   #主函数
    print("主进程启动")
    #获取当前进程pid
    x = os.getpid()
    print(x)
    #创建一个子进程
    #target 说明进程执行的函数
    #args  给子进程对象传送的参数 要以元组的形式
    p = Process(target=run, args=("nice",))
    p.start()   #启子进程对象
    while True:
        print("主进程进行中")
        time.sleep(1)

用进程池启动大量子进程

multiprocessing 该库中有一个 Pool 
Pool 是进程池,进程池中的进程进行没有先后顺序
创建进程池 p = Pool(4)  表示可以同时执行的进程 默认是核心数
p.clos 关闭进程池 
p.join() 主程序阻塞 ,等待子程序结束
from multiprocessing import Pool
import os
import time
import random
def run(name):
    print("子进程%s开始----%s"%(name,os.getpid()))
    start = time.time()
    time.sleep(random.choice(range(5)))
    end = time.time()
    print("子进程%d结束----%s---耗时%2f" %(name, os.getpid(), end-start))

if __name__ == "__main__":
    print("父进程启动")
    #创建多个进程
    #进程池
    #表示可以同时执行的进程
    #Pool 默认时cpu核心数
    #p.apply_async(run,args=(i,)) 将进程加入进程池
    pp = Pool(4)
    for i in range(5):
        #创建进程 放入进程池 统一管理
        pp.apply_async(run,args=(i,))
    #再调用join之前必须先调用 close 且调用close后不能添加进程了
    pp.close()
    #进程池对象调用的join,对等待进程池中所有的子进程都结束后在执行父进程
    pp.join()
    print("父进程结束")

全局变量在多个进程中不能共享

子进程通过 global 修改全局变量,在主程序中不起作用
from multiprocessing import Process
import time
num = 100
def run():
    print("子进程开始")
    global num
    num += 1
    print(num)
    print("子进程结束")
if __name__ == "__main__":
    print("父进程开始")
    p = Process(target=run)
    p.start()
    p.join()
    #在子进程中修改全局变量对父进程没有影响
    #在创建子进程时对全局变量做了备份 父进程中的num和子进程中的num不一样
    print(num)

父子进程的先后顺序

from multiprocessing import Process
import time
import os
def run(str):
    print("紫禁城开始")
    time.sleep(3)
    print("紫禁城结束")
if __name__ == '__main__':
    print("主进程启动")
    p = Process(target=run)
    p.start()
    print("父进程结束")
    '''
    父进程的结束不能影响子进程
    '''
    p.join()  #等待子进程结束后 父进程再往下执行

进程间的通信

from multiprocessing import Process ,Queue
import os ,time
def write(q):
    print("启动子进程%s" % (os.getpid()))
    for x in ["A", "B", "C", "D"]:
        q.put(x)
        time.sleep(1)
    print('子进程结束%s' % os.getpid())
def read(q):
    print("启动子进程 %s" % os.getpid())
    while True:
        value = q.get(True)
        print('value=' + value)
    print("结束子进程%s" % os.getpid())
if __name__ == "__main__":
    #父进程创建队列,并传递给子进程
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    pw.start()
    pr.start()
    pw.join()
    #pr进程是个死循环,无法等待其结束,只能强行结束
    pr.terminate()
    print("父进程结束")
    while True:
        pass

进程对象的封装

封装py

from multiprocessing import Process
import time
import os
class jiuzhu(Process):
    def __init__(self, name):
        Process.__init__(self)
        self.name = name
    def run(self):
        print("子进程%s启动-----PID:%s" % (self.name, os.getpid()))
        start = time.time()
        '''
        子进程功能
        '''
        end = time.time()
        print("子进程%s结束-----PID:%s----用时%d秒" % (self.name, os.getpid(),end - start))

主函数

if __name__ == '__main__':
    print("主进程开始")

    #创建导入的某一功能子进程
    p = jiuzhu("name")
    #自动调用子进程
    p.start()
    p.join()
    print("主进程结束")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值