欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python之进程学习(二)

程序员文章站 2022-09-14 13:25:11
进程进程间的通信进程池进程池的使用进程池间的通信进程池应用进程间的通信对于线程来说,多线程间共享全局变量,但是进程就不一样了,如果想要在多进程间进行通信,应该搭个桥梁,例如建立一个进程队列代码示例import multiprocessingdef a(q): list1 = [1, 2, 3] for i in list1: q.put(i) print('入队完成!')def b(q): list2 = list() while...

进程

进程间的通信

对于线程来说,多线程间共享全局变量,但是进程就不一样了,如果想要在多进程间进行通信,应该搭个桥梁,例如建立一个进程队列

代码示例

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