进程
进程的概念
- 进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
引入进程的原因
- 为了提高资源利用率和系统处理能力,现阶段计算机学院都是多道程序系统,即多道程序并发执行
- 优化系统资源,方便计算调度,避免系统运算紊乱
- 进程是一种数据结构,能够清晰的刻画动态系统的内在规律,增加程序运行时的动态性
进程特征
- 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的
- 并发性:任何进程的可以同其其他进程一起并发执行。
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和跳读的独立单位
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各种独立的、不可预知的速度向前推进
进程和程序
- 进程:程序在处理机上的一次执行过程,他是一个动态的概念
- 程序:没有执行的代码,是一个静态的
进程和线程的区别
- 进程:在电脑上运行的多个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--")
多任务文件夹复制
- 获取用户要copy的文件夹的名称
- 创建一个新的文件夹
- 获取文件夹的所有待copy的文件名字
- 创建进程池
- 向进程池中添加拷贝任务
'''
多任务-进程-文件夹复制
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()