python--多进程管理包-multiprocessing实例

进程multiprocessing.Process

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Date  : 2021/6/16
# @Name  : ZhouZongXin

"""
# multiprocessing创建子进程。
新的进程是原有进程的子进程,子进程复制父进程全部的内存空间代码段,有个进程可以创建多个子进程。
子进程只执行指定的函数,其余内容均是父进程执行内容,但是子进程也拥有其他父进程资源。
各个进程在执行上互不影响,也没有先后顺序关系。
进程创建后,各个进程空间度独立,相互没有影响。
multiprocessing创建的子进程无法使用标准输出(input)
"""
import multiprocessing
import time


def fun(count):
    for _ in range(count):
        print("开始执行进程函数。。。。。。")
        print(time.time())
        time.sleep(2)
        print("进程执行结束")


if __name__ == '__main__':

    # 创建进程对象
    p_list = []
    for _ in range(5):
        p = multiprocessing.Process(target=fun, args=(1,))  # 传参方法1、以元祖方式传递参数
        # p = multiprocessing.Process(target=fun, kwargs={"count": 2})  # 传参方法2、以字典方式传递参数
        p_list.append(p)
        print(p.name)  # 进程名

    # 启动进程
    for i in p_list:
        i.start()
        print(i.pid)  # 进程pid,在start后才会有进程ID

    # 等待执行完后回收
    for j in p_list:
        j.join()

进程池multiprocessing.Pool

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Date  : 2021/6/16
# @Name  : ZhouZongXin

"""
"""
from multiprocessing import *
import time


def fun(count):
    for _ in range(count):
        print(f"开始执行进程函数{time.ctime()}。。。。。。{count}")
        time.sleep(2)


if __name__ == '__main__':
    count = 1

    # 如果父进程退出,进程池自动销毁
    pool = Pool()  # 创建进程池,不写默认CPU进程数

    for i in range(10):
        msg = "Tedu-%d" % i
        pool.apply_async(func=fun, args=(count,))  # 事件开始执行

    pool.close()  # 关闭进程池
    pool.join()  # 回收进程池


创建进程类

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Date  : 2021/6/21
# @Name  : ZhouZongXin

"""
创建进程类
"""
from multiprocessing import Process


# 自定义类
class MyProcess(Process):

    def __init__(self, values, count):
        self.values = values
        self.count = count
        super().__init__()  # 加载父类属性

    def fun1(self):
        print("步骤1:假设很复杂", self.values)

    def fun2(self):
        print("步骤2:假设也很复杂", self.values)

    def run(self):
        for _ in range(self.count):
            self.fun1()
            self.fun2()


if __name__ == '__main__':
    process = MyProcess(1, 5)
    process.start()
    process.join()

图片切割练习题

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Date  : 2021/6/18
# @Name  : ZhouZongXin

"""
将一个文件拆分为两个部分,每个部分分别是文件的一般,即源文件的上下半部分,分别拆到一个新文件里

要求使用两个进程同时进行

提示:按照文件字节数计算文件大小
    os.path.getsize()
"""

import os
import multiprocessing

# 获取文件大小
size = os.path.getsize("google.jpg")


# 复制上半部分
def top():
    """
    如果是大文件写入文件尽量分开读取及写入,如果不分开写的话,对大文件来说很不友好
    :return:
    """
    rb = open("google.jpg", "rb")  # 读取图片
    wb = open("google1.jpg", "wb")  # 写入图片
    top_size = size // 2  # 图片大小除以2
    while top_size >= 1024:  # 如果照片字节大于等于1024将循环写入
        wb.write(rb.read(1024))  # 写入1024字节照片大小
        top_size -= 1024  # 减等1024
    else:  # 否则就是小于1024字节,直接写入
        wb.write((rb.read(top_size)))
    rb.close()
    wb.close()


# 复制下半部分
def bot():
    rb = open("google.jpg", "rb")
    wb = open("google2.jpg", "wb")
    rb.seek(size // 2, 0)  # 因为top写入上班部分,因此我们需要获取下半部分的字节,并且向右偏移0
    while True:  # 死循环
        data = rb.read(1024)  # 读取1024字节
        if not data:  # 如果读取到空那么就跳出循环
            break
        wb.write(data)  # 如果没有读取到空就写入1024字节
    rb.close()
    wb.close()


if __name__ == '__main__':
    p = multiprocessing.Process(target=top)  # 创建子进程
    p.start()
    bot()  # 父进程
    p.join()

进程通讯消息队列multiprocessing.Queue

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Date  : 2021/6/21
# @Name  : ZhouZongXin

"""

"""
from multiprocessing import *

# 创建一个消息队列
q = Queue()


def request():
    name = "zhouzongxin"
    password = "123456"
    # 存入消息队列q.put()
    q.put(name)
    q.put(password)


def handle():
    # 获取消息队列内容q.get()
    name = q.get()
    password = q.get()
    print(f"账号:{name},密码:{password}")


if __name__ == '__main__':
    p1 = Process(target=request)
    p2 = Process(target=handle)

    p1.start()
    p2.start()

    p1.join()
    p2.join()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值