python 内置模块multiprocessing,进程

一、简介

进程是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行;每个进程都是独立运行的,不互相干扰

二、基本使用

import multiprocessing
import time
import os

start_time = time.time()

def process1(text):
    print('process1:',os.getpid())
    time.sleep(1)
    print(text)

def process2(text):
    print('process2:',os.getpid())
    time.sleep(2)
    print(text)



if __name__ == '__main__':
    t1 = multiprocessing.Process(target=process1, args=('process1_sleep',))
    t2 = multiprocessing.Process(target=process2, args=('process2_sleep',))

    t1.start()
    t2.start()

    t1.join()#等待进程结束
    t2.join()#等待进程结束

    end_time = time.time()

    print('主进程结束', end_time - start_time)

三、方法

  1. multiprocessing.Process(target,name,args,kwargs) 创建进程,target:执行的目标任务名、name:进程名字、args:以元组方式给执行任务传参、kwargs:以字典方式给执行任务传参
  1. multiprocessing.Lock() 同步锁:最多只有一个持有该锁,被加锁的进程在运行时不会将执行权交出去,只有当该进程被解锁时才会将执行权通过系统调度交由其他进程
  1. multiprocessing.Rlock() 递归锁,RLock允许在同一进程中被多次acquire,Lock不允许
  1. multiprocessing.Condition() 条件锁,条件锁是在递归锁的基础上增加了暂停进程运行的功能,可以使用wait()与notify()来控制进程执行的个数
  1. multiprocessing.Event() 事件锁,事件锁是基于条件锁来做的,它与条件锁的区别在于一次只能放行全部,不能放行任意个数量的子进程继续运行
  1. multiprocessing.Semaphore() 信号量锁,成批的放行特定个处于“上锁”状态的进程
  1. multiprocessing.BoundedSemaphor(value) 信号量锁 会检查内部计数器的值,并保证它不会大于初始值,如果超了,就引发一个 ValueError
  2. multiprocessing.Queue(size):进程队列,size队列个数
'''
因进程之间是独立运行的,所以全局变量不会共享,如需共享需要用到队列
以下例子会发现全局num不会再进程之间共享,而在task1中的put进的队列数据可以共享
'''

import multiprocessing

num = 1

def task1(q):
    global num
    num = 2
    q.put(1)
    q.put(2)

def task2(q):
    print(f'task2:num={num}')
    print('队列:', q.get())
    


if __name__ == '__main__':
    process_q = multiprocessing.Queue()

    process1 = multiprocessing.Process(target=task1,args=(process_q,))
    process2 = multiprocessing.Process(target=task2,args=(process_q,))

    process1.start()
    process2.start()

    process1.join()
    process2.join()

    print('队列:', process_q.get())
    print(f'全局变量:num={num}')
  1. multiprocessing.SimpleQueue() 简化的队列,无跟踪任务的功能,只具有empty、get、put3个方法
  1. multiprocessing.JoinableQueue(size):可阻塞的进程队列,size队列个数
import multiprocessing
import time
import random


def task1(q):
    for i in range(10):
        q.put(i)
        time.sleep(random.randint(1, 3))
        q.join()
        print('数据处理完毕')


def task2(q):
    while True:
        print('task2队列:', q.get())
        q.task_done()


if __name__ == '__main__':
    process_q = multiprocessing.JoinableQueue()

    process1 = multiprocessing.Process(target=task1, args=(process_q,))
    process2 = multiprocessing.Process(target=task2, args=(process_q,))

    process2.daemon = True

    process1.start()
    process2.start()

    process1.join()

    print('主进程结束')
  1. multiprocessing.Pipe():进程通道,用法基本和Queue一致,返回一对 Connection 对象 (conn1, conn2) ,conn1 只能用于接收消息,conn2 仅能用于发送消息
from multiprocessing import Process, Pipe
import time


def task(i, pip):
    while True:
        a = pip.recv()
        print(f"进程{i}收到一个{a}")
        time.sleep(0.5)
        pip.send(a + 1)


if __name__ == '__main__':
    pip_start, pip_end = Pipe()
    Process(target=task, args=(1, pip_start)).start()
    Process(target=task, args=(2, pip_end)).start()
    pip_start.send(1)
  1. process.current_process() 返回当前进程
  2. process.active_children() 返回当前存活的进程列表
  3. process.parent_process():返回父进程
  4. process.cpu_count():返回cpu数量

三、进程池

进程池multiprocessing.Pool()的多进程之间的通信要用multiprocessing.Manager().Queue()

  1. multiprocessing.Pool()
from multiprocessing import Process,Pool
import time

def task(task):
    time.sleep(1)
    print(task * task)
    


if __name__ == '__main__':
    task_list = [1, 2, 3, 4, 5, 6]
    print('顺序:')
    start_time = time.time()
    for i in task_list:
        process = Process(target=task, args=(i,))
        process.start()
        process.join()
    end_time = time.time()
    print('顺序执行时间',end_time - start_time)

    print('多进程进程池:')
    start_time = time.time()
    pool = Pool(6)
    pool.map(task,task_list)
    pool.close()
    pool.join()
    end_time = time.time()
    print('多进程执行时间', end_time - start_time)
  1. concurrent.futures 模块,线程池、进程池
展开阅读全文

页面更新:2024-04-16

标签:递归   进程   队列   线程   模块   对象   状态   结束   事件   时间   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top