python修炼day32!

资讯 5年前
1.41K

今日内容概述:

多进程实现文件夹下载、迭代器、生成器、协程

昨日回顾

程序:一个静态的概念

进程:一个动态的概念,就是程序运行起来的状态,用于一定的资源

线程:运行在进程之内,依赖于进程,

进程和线程区别:

共同点:都可以完成多任务区别:    线程:  threading        依赖于进程        多线程之间共享全局的变量        主线程等待子线程结束,才结束        系统开销较小    进程: multiprocessing        运行起来的应用程序,占有一些资源        写时拷贝,进程不共享全局的资源        通过队列实现进程间通信        系统开销比较大

进程的创建:

multiprocessing.Process(target=函数名,args=(参数))继承方式创建进程class 子类名(multiprocessing.Proces):    def run(self):        pass

进程间通信(传递数据 ):

q = multiprocessing.Queue(3)      # 创建一个队列,可以指定可传递几个数据q.put ()   # 存    q.get()     # 取     q.qsize()  # 取消息数量   q.full()  # 判断是否满了q.empty  # 判断是否为空

进程池:

一个特殊的容器,里面创建了很多进程,重复利用进程作用:减少了创建,销毁进程的过程,提高了效率po =  multiprocessing.Pool(3)  # 定义一个进程池,最大进程数2po.apply_async(要调用的目标,(要传递的参数))  # async 异步po.close()   # 关闭进程池po.join()   # 等待所有的子进程执行完毕

今日内容

文件夹复制:

os.listdir()  # 列出文件夹中所有的文件名os.path.getsize()  # 获取文件的大小os.mkdir()  # 新建文件夹Pool()  # 创建进程池Manger().Queue()  # 有进程池的时候,队列需要 Manger()中的Queue()    with open("文件名", “rw”) as f:    f.read()  # 读    f.write()  # 写

文件夹复制代码

import multiprocessing

import os, time

def save_folder(q, dw_folder_name, save_folder_name, file_name):

with open(dw_folder_name + "/" + file_name, "rb") as f:

content = f.read()

# 在新创建的文件中写入文件

with open(save_folder_name + "/" + file_name, "wb") as f2:

f2.write(content)

new_file_size = os.path.getsize(save_folder_name + "/" + file_name)

q.put(new_file_size)

def main():

# 提示用户输入文件夹名

dw_folder_name = input("请输入要下载的文件夹的名字:")

try:
       # 创建一个新文件夹
       save_folder_name = dw_folder_name + "[嘿嘿嘿]"
       os.mkdir(save_folder_name)

except:

pass

# 获取目标文件夹中的所有的文件 os.listdir()

file_names = os.listdir(dw_folder_name)

# 添加进程池

po = multiprocessing.Pool(3)

# 创建队列

q = multiprocessing.Manager().Queue()

# 从目标文件夹中读取文件

for file_name in file_names:
       po.apply_async(save_folder, (q, dw_folder_name, save_folder_name, file_name))

po.close()

# po.join()

# 获取文件夹的大小

folder_size = 0

for old_file in file_names:

old_file_s = os.path.getsize(dw_folder_name + "/" + old_file)

folder_size += old_file_s

print("文件夹总大小为: %d" % folder_size)

new_file_size = 0

# 显示进度

while True:

s = q.get()
       new_file_size += s
       time.sleep(0.1)
       print("拷贝的进度为: %.2f %%" % (new_file_size / folder_size * 100), end="")
       if new_file_size >= folder_size:

break

print()

if __name__ == "__main__":

main()

进程池中的进程出现异常不会显示

© 版权声明

相关文章