python—进程总结

在这里插入图片描述

CSDN话题挑战赛第2期
参赛话题:学习笔记


一、进程对象的方法

start:启动进程
run:负责进行执行target指定的任务函数

在这里插入图片描述

from multiprocessing import Process
import time
def work():
    for i in range(6):
        print(f"主进程{i}工作")
        time.sleep(1)

def work1():
    for i in range(5):
        print(f"主进程{i}学习")
        time.sleep(1)

if __name__ == '__main__':
    t1=Process(target=work)
    t2=Process(target=work1)
    t1.start()
    t2.start()
    print('主进程执行完毕')

    for i in range(6):
        print('------------------------hahaha')
        time.sleep(1)

主进程执行完毕
------------------------hahaha
主进程0工作
主进程0学习
------------------------hahaha
主进程1工作
主进程1学习
------------------------hahaha
主进程2工作
主进程2学习
------------------------hahaha
主进程3工作
主进程3学习
------------------------hahaha
主进程4工作
主进程4学习
------------------------hahaha
主进程5工作

二、多个进程如何共享数据

案例一、进程与进程之间相互独立,不会改变全局变量

from multiprocessing import Process
import time

n=0
def work():
    global n
    n=1000+n
    print('work',n)


def work1():
    global n
    n = 10000 + n
    print('work1', n)


if __name__ == '__main__':
    t1 = Process(target=work)
    t2 = Process(target=work1)
    t1.start()
    t2.start()

    print('主进程执行完毕',n)

主进程执行完毕 0
work 1000
work1 10000

案例二、使用进程中得队列JoinableQueue实现

进程的创建由用户控制,进程的调度、执行、阻塞调度由操作系统控制
data=q.get(timeout=1):表示如果超过1s队列中还没有数据,处理数据的线程阻塞

from multiprocessing import Process,JoinableQueue,Manager
import time

def work(q):
    for i in range(5):
        for j in range(20):
            q.put(f'生产数据{j}')
            print(f'【生产数据{j}】')
        time.sleep(1)

def handle(q):
    while True:
        for i in range(4):
            try:
                data=q.get(timeout=1)
            except:
                return
            else:
                print('获取数据:',data)
                q.task_done()
        time.sleep(1)

if __name__ == '__main__':
    que = JoinableQueue()
    st=time.time()
    t=Process(target=work,kwargs={'q':que})
    t.start()

    thread_list=[]
    for i in range(3):
        t1=Process(target=handle,kwargs={'q':que})
        t1.start()
        thread_list.append(t1)

    #todo 等待数据生产完成
    t.join()
    for t1 in thread_list:
        t1.join()
    #todo 等待队列中的数据处理完成
    que.join()

    print('主线程执行完毕')
    st1=time.time()
    print('程序执行时间:',st1-st)

1、queue模块中的队列(Queue),它只能用于单个进程中(多个线程之间的数据共享)
2、multiprocessing中的队列,专为python多进程(Process)数据共享而设计的(多个进程的数据传输)——multiprocessing.Queue()
3、multiprocessing.Manager().Queue():python中进程池通信专用的队列

三、进程池的使用

t1 = ThreadPoolExecutor(max_workers=5):创建一个线程池,线程池中最多支持同时执行多少个任务
t1.submit(*args, **kwargs):往线程池中提交执行的任务
t1.shutdown():等待线程池中所有的任务执行完毕之后,开始执行

from concurrent.futures.process import ProcessPoolExecutor
from concurrent.futures.thread import ThreadPoolExecutor

import time
import threading
def work(name):
    for i in range(6):
        print(f"进程1工作---{name}")
        time.sleep(1)

def work1(name):
    for i in range(5):
        print(f"进程2学习---{name}")
        time.sleep(1)

if __name__ == '__main__':
    #todo 创建一个进程池
    t1 = ProcessPoolExecutor(max_workers=5)  # todo 进程池中最多支持同时执行多少个任务

    st=time.time()
    #todo 往进程池中提交执行的任务
    t1.submit(work,'kobe')
    t1.submit(work1,'james')

    #todo 等待进程池中所有的任务执行完毕之后,开始执行
    t1.shutdown()
    et=time.time()
    print('执行的时间:',et-st)

四、往线程池中批量提交任务

t1.map(func1,li):往线程池中批量提交任务

等价于

for i in li:
     t1.submit(func1,i)

每遍历出一条数据,向线程池中提交一条数据

from concurrent.futures.process import ProcessPoolExecutor
from concurrent.futures.thread import ThreadPoolExecutor

import time
import threading

def func1(item):
    for i in range(2):
        print('正在执行任务{},的第{}轮'.format(item,i))
        time.sleep(0.25)


if __name__ == '__main__':
    #todo 创建一个进程池
    t1 = ProcessPoolExecutor(max_workers=3)  # todo 进程池中最多支持同时执行多少个任务
    li=[11,6,8,24,22]           #todo 用例数据

    #todo 批量往进程池中提交任务
    t1.map(func1,li)
    #todo 等价于
    # for i in li:
    #     t1.submit(func1,i)

五、with操作线程池和进程池对象

from concurrent.futures.process import ProcessPoolExecutor

import time
import threading

def func1(item):
    for i in range(2):
        print('正在执行任务{},的第{}轮'.format(item,i))
        time.sleep(0.25)

if __name__ == '__main__':
    st=time.time()
    with ProcessPoolExecutor(max_workers=2) as tp:
        tp.map(func1,[11,22,33])
    et=time.time()
    print('时长:',et-st)

六、进程间实现数据通信

q=Manager().Queue():使用进程池专用的队列进行数据传输

from concurrent.futures.process import ProcessPoolExecutor
from multiprocessing import Manager

def work1(q):
    number=q.get()
    number = number + 100
    print("--------work1-----number---", number)
    q.put(number)


def work2(q):
    number = q.get()
    number = number + 66
    print("--------work2-----number---", number)
    q.put(number)


if __name__ == '__main__':
    number = 100
    #todo 使用进程池专用的队列进行数据传输
    q=Manager().Queue()
    q.put(number)
    with ProcessPoolExecutor(max_workers=3) as f:
        f.submit(work1,q)
        f.submit(work2,q)

    number=q.get()
    print('主进程number',number)

--------work1-----number— 200
--------work2-----number— 266
主进程number 266


在这里插入图片描述

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值