对于线程来说,多线程间共享全局变量,但是进程就不一样了,如果想要在多进程间进行通信,应该搭个桥梁,例如建立一个进程队列
代码示例
import multiprocessing
def a(q):
list1 = [1, 2, 3]
for i in list1:
q.put(i)
print('入队完成!')
def b(q):
list2 = list()
while not q.empty():
list2.append(q.get())
print('出队完成!')
print(list2)
if __name__ == '__main__':
# 创建一个进程队列,为两个进程间搭一个桥梁,方便进程间的通信
q = multiprocessing.Queue()
# 创建两个进程
p1 = multiprocessing.Process(target=a, args=(q,))
p2 = multiprocessing.Process(target=b, args=(q,))
# 执行进程
p1.start()
p2.start()
multiprocessing.Process()
来创建进程,但是如果进程数量上百甚至上千时,这时为了追求效率,我们可以使用进程池(multiprocessing.Pool()
)import multiprocessing
import time
import os
def a(num):
# 记录开始时间
time_start = time.time()
# 打印信息
print(f"任务{num}开始执行, 进程号为:{os.getpgid()}")
time.sleep(1)
# 记录结束时间
time_stop = time.time()
# 打印任务消耗时长
print(f"{num}任务完成,耗时{time_start - time_stop}")
if __name__ == '__main__':
# 创建进程池,限定3个进程同时进行
po = multiprocessing.Pool(3)
for i in range(9):
# 给进程池添加九个任务
po.apply_async(a, (i,))
# 关闭进程池,不再接收请求
po.close()
print('Main')
# 等待子进程结束
po.join()
和进程一样,需要一个队列充当桥梁,不过使用的是进程池队列multiprocessing.Manager().Queue()
代码示例
import multiprocessing
def a(q):
q.put('a')
def b(q):
print(q.get())
if __name__ == '__main__':
# 创建进程池
po = multiprocessing.Pool(3)
# 创建进程池队列
q = multiprocessing.Manager().Queue()
# 两个进程执行任务
po.apply_async(a, (q,))
po.apply_async(b, (q,))
# 关闭进程池
po.close()
po.join()
多任务文件复制
需求:实现多任务文件复制
代码示例
import multiprocessing
import os
def copy_file(file_name, new_fole_name, old_fold_name):
# 读取文件内容
with open(old_fold_name + "/" + file_name, 'rb') as f:
content = f.read()
# 复制文件并保存到新文件夹中
with open(new_fole_name + '/' + file_name, 'wb') as f:
f.write(content)
def main():
# 1、获取文件夹名字
old_fold_name = input('请输入文件夹名:')
# 2、创建新的文件夹
new_fole_name = old_fold_name + '副本'
# 不存在则创建文件夹
if not os.path.exists(new_fole_name):
os.mkdir(new_fole_name)
# 3、获取文件夹里的所有文件名
file_names = os.listdir(old_fold_name)
# 4、创建进程池
po = multiprocessing.Pool()
# 5、添加拷贝任务
for i in file_names:
copy_file(i, new_fole_name, old_fold_name)
po.close()
po.join()
print('拷贝完成')
if __name__ == '__main__':
main()
最后,有喜欢博主写的内容的伙伴可以点赞收藏加关注哦!
本文地址:https://blog.csdn.net/weixin_44604586/article/details/107190315
如对本文有疑问, 点击进行留言回复!!
HTT-Chain基于区块链3.0的物联网应用生态网络即将全球上线
编程入门必看:带你零基础了解编程和编程语言,入门应该学什么?
Windows汇总 ~命令;相关操作;windows详解等;持续更新
网友评论