实现多任务的另一种形式
程序是可以运行的,运行起来叫做进程,能够分配各种资源。(网络、显卡、鼠标、键盘、蓝牙…)
程序只有一个,但是进程可以多个。




使用进程实现多任务

import time
import multiprocessingdef test1():while True:print('----1-----')time.sleep(1)def test2():while True:print('----2-----')time.sleep(1)def main():p1 = multiprocessing.Process(target=test1)p2 = multiprocessing.Process(target=test2)p1.start()p2.start()if __name__ == '__main__':main()


可以看出,进程和我们学过的线程 效果是一样的。
在ubuntu 中查看所有进程

ps -aux


进程 和 线程 都能实现多任务,但是进程占用的资源比较大。

进程和线程的区别:

线程不能独立执行,必须已存在进程中。
可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线上的工人。

一个程序至少有一个进程,一个进程至少有一个线程。
线程的划分尺度小于进程,使得多线程程序的并发性高。
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。比如:

网易云和天天静听 是两个进程,同时打开就是多进程,在每个进程中,既可以播放音乐,同时又能下载音乐,这就是多线程。

线程之间共享数据,但是进程是独立的,所以进程之间主需要通信。–队列

队列:先进先出–Queue
栈:先进后出

解耦:避免两个程序之间联系太过密切。

多进程之间通过Queue 来实现数据共享:

import multiprocessingdef download_from_web(q):'''下载数据'''data = [1, 2, 3]# 向队列中写诶数据for i in data:q.put(i)print('---下载器已经下载完了数据,并且写入队列中')def analysis_data(q):'''数据处理'''waitting_data = list()# 从队列中获取数据while True:data = q.get()waitting_data.append(data)if q.empty():break# 模拟数据处理print(waitting_data)def main():# 创建一个队列q = multiprocessing.Queue()p1 = multiprocessing.Process(target=download_from_web, args=(q,))p2 = multiprocessing.Process(target=analysis_data, args=(q,))p1.start()p2.start()if __name__ == '__main__':main()



任务数确定,创建对应的进程就可以,当任务数不确定,创建进程池。

这个程序 ,我在windows 上的pycharm 没有实现。不知道为啥。
本应该的运行结果:

from multiprocessing import Pool
import os, time, randomdef worker(msg):t_start = time.time()print('%s开始执行,进程号:%d' % (msg, os.getpgid()))# random.random() 随机生成0-1之间的浮点数time.sleep(random.random()*2)t_stop = time.time()print(msg, '执行完毕,耗时%0.2f' % (t_start - t_stop))def main():po = Pool(3)  # 创建一个进程池,最大进程数3for i in range(0,10):# Pool().apply.async(要调用的目标,(传递给目标的参数元祖,))# 每次循环都会用空闲出来的子进程去调用目标po.apply_async(worker,(i,))print('----start---')po.close()  # 关闭进程池,关闭后po 不在接收新的请求po.join()  # 等待po 中所有子进程执行完成,必须放在close之后,保证主进程运行时间大于子进程。print('----end-----')if __name__ == '__main__':main()


多任务文件夹拷贝:

import os
import multiprocessingdef copy_file(q, file_name, old_folder_name, new_folder_name):'''完成文件的复制'''old_f = open(old_folder_name + '/' + file_name, 'rb')  # 路径,用 / 连接content = old_f.read()old_f.close()new_f = open(new_folder_name + '/' + file_name, 'wb')new_f.write(content)new_f.close()# 如果拷贝完了文件,那么就向队列中写入一个消息,表示已经完成q.put(file_name)def main():# 1. 获取用户要拷贝的文件夹的名字old_folder_name = input('请输入要复制的文件夹的名字:')# 2. 创建一个新的文件夹try:new_folder_mame = old_folder_name + '[复件]'os.mkdir(new_folder_mame)except:pass# 3. 获取文件夹中所有文件的名字 listdir()file_names = os.listdir(old_folder_name)# print(old_folder_name)# 4. 创建进程池po = multiprocessing.Pool(5)# 5. 创建一个队列q = multiprocessing.Manager().Queue()# 向进程池中添加 copy 文件的任务for file_name in file_names:po.apply_async(copy_file,args=(q, file_name, old_folder_name, new_folder_mame))po.close()# po.join()all_file_num = len(file_names)  # 测一下文件个数copy_num = 0while True:file_name = q.get()# print('已经完成拷贝: %s' % file_name)copy_num += 1print('拷贝的进度为 %.2f %%' % (copy_num * 100 / all_file_num),end='\r') # \r 表示一直都在顶行显示if copy_num >= all_file_num:breakprint()if __name__ == '__main__':main()

在运行中遇到很多问题,

  1. 要复制的文件夹必须在工程下,否则找不到路径
  2. 要复制的文件夹中不能再包含文件夹,否则程序一直不结束。

    但是,不成功的地方也有,想要在一行显示进度条,但是不知道为啥不成功。
    大概是这样的效果:进度从0变到100,只更新不换行。

1

多任务---进程、进程池相关推荐

  1. 如何写一个高效进程/线程池_关于高效企业测试的思考(1/6)

    如何写一个高效进程/线程池 企业中的测试仍然没有得到应有的广泛应用. 编写尤其是维护测试需要花费时间和精力,但是缩短软件测试并不是解决方案. 为了提高测试效率,应该追求哪些范围,方法和测试技术? 基于 ...

  2. 什么是多任务、进程、线程

    多任务处理是指用户可以在同一时间内运行多个应用程序(执行多个任务) 执行方式有两种:并发与并行 并发 交替执行,比如你的电脑上开启了软件1和软件2两个软件,如果你的电脑是单核,则cpu操作操作系统去轮 ...

  3. 嵌入式Linux多任务编程 进程 管道 命名管道

    进程 进程是一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统执行资源分配和保护的基本单位. 程序的一次执行就是一个进程 一个程序可以派生多个进程 多个不同程序运行的时候, ...

  4. Linux——孤儿进程|进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量

    目录 孤儿进程 进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量 习题 孤儿进程 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢? 父进程先退出,子 ...

  5. 并发 --- 31 进程锁 守护进程 进程队列

    一.进程的其他方法 1.   .name      进程名   (可指定) 2.  .pid     进程号 3.   os.getpid         在什么位置就是什么的进程号 4.   .is ...

  6. 命名管道(FIFO) Linux进程进程间的通信之命名管道(FIFO)

    Linux进程进程间的通信之命名管道(FIFO) 命名管道(FIFO),它和一般的管道一样.都是作为中间的邮递员来实现两个进程间的通信交流. 命名管道(FIFO)有几个特点: 1.命名管道(FIFO) ...

  7. HTTP协议与WEB框架、多任务、进程

    HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是应用层协议.HTTP是万维网的数据通信的基础. HTTP协议概述 HTTP是一个客户端 ...

  8. python守护进程进程池_Python3标准库:multiprocessing像线程一样管理进程

    Python Python开发 Python语言 Python3标准库:multiprocessing像线程一样管理进程 1. multiprocessing像线程一样管理进程 multiproces ...

  9. Python多任务(8.进程与线程之间的区别以及多进程和多线程的区别 )

    1. 进程.线程的对比 进程,能够完成多任务,比如:  一台电脑上可以运行登录多个QQ 线程,能够完成多任务,比如: 一个QQ中可以和有多个聊天窗口 进程里面包含线程,线程不能够独立执行,必须依存在进 ...

  10. python守护进程进程池_Python—守护进程管理工具(Supervisor)

    一.前言简介 1.Supervisor 是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程.可以很方便的用来启动.重启.关闭进程(不仅仅是 ...

最新文章

  1. WebService的编写与调用
  2. TCL中关于Cells的一些使用方法?
  3. yolo python_YOLO目标检测快速上手
  4. 架构师之路 — 软件架构 — 软件版本定义
  5. android开发蓝牙是否可见开关_如何从后台开启android蓝牙的可见性以及始终保持可见性...
  6. ajax onerror code,Ajax请求'onError'处理程序
  7. eclipse中导入maven项目:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.proje...
  8. Java基础学习总结(111)——Java虚拟机JVM总结大全
  9. 解决VC++6.0打开文件或添加文件到工程出错的问题
  10. 《湮灭》脑洞:行星级癌变与人的自我救赎
  11. [CF888G] Xor-mst (Trie 树,最小生成树)
  12. 使用STM32固件库开发GD32 汇总
  13. Notepad ++ 汉化版
  14. Go开发的程序如何使用加密狗保护
  15. P3717 [AHOI2017初中组]cover
  16. 纹理(Textures)
  17. Kubernetes(K8s)最新版搭建
  18. 数据库32位升级到64位解决方案
  19. android分享图片到qq,Android实现截图分享qq,微信
  20. LiveNVR安防摄像头Web无插件直播平台页面的快速集成方法

热门文章

  1. Generative Model - 李宏毅笔记
  2. 铲子哥,可在CentOS安装mysql数据库时铲土填坑
  3. [喵咪BELK实战(3)] logstash+filebeat搭建
  4. 牛客练习赛77 小G的约数(整除分块)
  5. [教程] NETGEAR R7800 路由器TFTP刷机方法(适用于.img格式固件各种刷)
  6. ITK-SNAP 安装和使用
  7. try-finally的详解
  8. 重庆华清远见-前端部分阶段学习
  9. Revit二次开发基础教程
  10. MPTCP协议在mininet中的性能测试