Python - 进程

进程

进程的概念

  • 进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。

引入进程的原因

  • 为了提高资源利用率和系统处理能力,现阶段计算机学院都是多道程序系统,即多道程序并发执行
  • 优化系统资源,方便计算调度,避免系统运算紊乱
  • 进程是一种数据结构,能够清晰的刻画动态系统的内在规律,增加程序运行时的动态性

进程特征

  • 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的
  • 并发性:任何进程的可以同其其他进程一起并发执行。
  • 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和跳读的独立单位
  • 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各种独立的、不可预知的速度向前推进

进程和程序

  • 进程:程序在处理机上的一次执行过程,他是一个动态的概念
  • 程序:没有执行的代码,是一个静态的

进程和线程的区别
- 进程:在电脑上运行的多个QQ程序
- 线程:在电脑上运行的多个QQ聊天窗口
- 根本区别 : 进程是操作系统的资源分配的基本单位。 线程操作系统的任务调度和执行的基本单位

Process属性方法介绍

方法/属性 说明
start() 启动多进程,t调用进程中的run()方法
run() 进程启动时运行的方法,正是它去调用target指定的函数
join() 守护线程
name 进程的名字

使用多进程实现多任务
导入多进程:import multiprocessing
启动多进程:start

# -*- coding: utf-8 -*- 
# @Time : 2020/2/27 10:45 
# @Author : 大数据小J

import multiprocessing


def demo():
    print('--这是1--')


def demo1():
    print('--这是2--')


def main():
    th1 = multiprocessing.Process(target=demo)
    th2 = multiprocessing.Process(target=demo1)

    # 启动多进程
    th1.start()
    th2.start()


if __name__ == '__main__':
    main()

多进程共享全局变量

  • 共享全局变量不适用于多进程编程

进程池

  • 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程,但是如果是上百甚至上千个目标,手动的去创建的进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法
from multiprocessing import Pool

import os,time,random

def worker(msg):
    t_start = time.time()
    print('%s开始执行,进程号为%d'%(msg,os.getpid()))
    
    time.sleep(random.random()*2)
    t_stop = time.time()
    print(msg,"执行完成,耗时%0.2f"%(t_stop-t_start))

def demo():
    pass

if __name__ == '__main__':
    po = Pool(3)        # 定义一个进程池
    for i in range(0,10):
        po.apply_async(worker,(i,))    
    
    print("--start--")
    po.close()      
    
    po.join()       
    print("--end--")

多任务文件夹复制

  1. 获取用户要copy的文件夹的名称
  2. 创建一个新的文件夹
  3. 获取文件夹的所有待copy的文件名字
  4. 创建进程池
  5. 向进程池中添加拷贝任务

'''
多任务-进程-文件夹复制
1.获取用户要复制的文件夹的名字   test
2.创建一个新的文件夹            test[复件]
3.获取文件夹内的所有待复制的文件名字
4.创建进程池
5.向进程池添加任务
'''
import multiprocessing
import os
import time


def copy_file(q, old_folder_name, new_folder_name, file_name):
    """
    文件拷贝
    :return:None
    """
    # time.sleep(0.5)
    # print("\r从%s到%s拷贝的文件名称为:%s" % (old_folder_name, new_folder_name, file_name), end='')
    old_file = open(old_folder_name+'/'+file_name, 'rb')
    content = old_file.read()
    old_file.close()

    new_file = open(new_folder_name+'/'+file_name, 'wb')
    new_file.write(content)
    new_file.close()

    q.put(file_name)


def main():
    # 获取文件夹名字
    old_folder_name = input("请输入待复制的文件夹名字:")
    # 创建新的文件夹
    new_folder_name = old_folder_name + "复件"
    if not os.path.exists(new_folder_name):
        os.mkdir(new_folder_name)

    # 获取文件名字
    file_names = os.listdir(old_folder_name)

    po = multiprocessing.Pool(5)
    q = multiprocessing.Manager().Queue()

    for file_name in file_names:
        po.apply_async(copy_file, args=(q, old_folder_name, new_folder_name, file_name))

    po.close()
    # po.join()

    copy_file_num = 0
    file_count = len(file_names)

    while True:
        file_name = q.get()
        copy_file_num += 1
        time.sleep(0.2)
        print("\r拷贝进度%.2f %%" % (copy_file_num*100/file_count), end='')
        if copy_file_num >= file_count:
            break


if __name__ == '__main__':
    main()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章