python多任务-进程

概念

进程 = 代码 + 资源
一个程序运行起来就称之为进程,进程是一个拥有资源的(进程是一个资源分配的单位)

主进程死了,不影响子进程

知识点:
1、写时拷贝

代码实现

import multiprocessing
def test1():
    while True:
        print("1--------")
def test2():
    while True:
        print("2--------")
def main():
    p1 = multiprocessing.Process(target=test1)
    p2 = multiprocessing.Process(target=test2)
    p1.start()
    p2.start()

if __name__ == "__main__":
    main()


子进程传参

import multiprocessing
import os
def test(a, b, c, *args, **kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)
def main():
    print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid()))
    p = multiprocessing.Process(target=test, args=(11, 22, 33, 44, 55, 66, 77, 88), kwargs={"mm":11})
    p.start()
if __name__ == "__main__":
    main()

进程间相互通信

1、文件 同电脑见的进程通信(基于硬盘)
2、队列 同电脑见的进程通信(基于内存)
3、socket 不同电脑间的进程通信 (基于网络)
4、redis

进程池Pool

进程池的使用

# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, random

def worker(msg):
    t_start = time.time()
    print("%s开始执行,进程号为%d" % (msg,os.getpid()))
    # random.random()随机生成0~1之间的浮点数
    time.sleep(random.random()*2) 
    t_stop = time.time()
    print(msg,"执行完毕,耗时%0.2f" % (t_stop-t_start))

po = Pool(3)  # 定义一个进程池,最大进程数3
for i in range(0,10):
    # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
    # 每次循环将会用空闲出来的子进程去调用目标
    po.apply_async(worker,(i,))

print("----start----")
po.close()  # 关闭进程池,关闭后po不再接收新的请求
po.join()  # 等待po中所有子进程执行完成,必须放在close语句之后
print("-----end-----")

使用进程池的说明
1、使用进程池开启多任务,进程池中的主进程不会等待子进程结束才结束,一定要使用po.join()不然进程池中的任务不会执行
2、要使用等待子进程,必须先要关闭进程池po.close()
3、创建进程池的时候如果不指明最大数量,那么进程池的最大数量将根据系统的最大内存决定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章