进程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()