当前位置: 移动技术网 > IT编程>脚本编程>Python > python之进程学习(二)

python之进程学习(二)

2020年07月08日  | 移动技术网IT编程  | 我要评论

进程

进程间的通信

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

代码示例

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网