Python多任务(2)进程
2019-05-24 18:45
891 查看
文章目录
- 1.使用进程实现多任务
- 2.获取进程的pid
- 3.进程的运行顺序
- 4.给Process传递参数
- 5.多进程之间不共享全局变量
- 6.多进程之间通过Queue来实现数据共享
- 7.进程池
- 8.案例:多任务文件夹copy-v1
- 9.案例:多任务文件夹copy-v2显示进度
1.使用进程实现多任务
import threading import time import multiprocessing def test1(): while True: print("1--------") time.sleep(1) def test2(): while True: print("2--------") time.sleep(1) def main(): # t1 = threading.Thread(target=test1) # t2 = threading.Thread(target=test2) # t1.start() # t2.start() p1 = multiprocessing.Process(target=test1) p2 = multiprocessing.Process(target=test2) p1.start() p2.start() if __name__ == "__main__": main()
2.获取进程的pid
import multiprocessing import os import time def test(): while True: print("----in 子进程 pid=%d ,父进程的pid=%d---" % (os.getpid(), os.getppid())) time.sleep(1) def main(): print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid())) p = multiprocessing.Process(target=test) p.start() if __name__ == "__main__": main()
3.进程的运行顺序
import multiprocessing import os import time def test(): while True: print("----in 子进程 pid=%d ,父进程的pid=%d---" % (os.getpid(), os.getppid())) time.sleep(1) def test2(): while True: print("----in 子进程2 pid=%d ,父进程的pid=%d---" % (os.getpid(), os.getppid())) time.sleep(1) def main(): print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid())) p = multiprocessing.Process(target=test) p.start() p2 = multiprocessing.Process(target=test2) p2.start() if __name__ == "__main__": main()
4.给Process传递参数
import multiprocessing import os import time def test(a, b, c, *args, **kwargs): print(a) print(b) print(c) print(args) print(kwargs) def main(): print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid())) p = multiprocessing.Process(target=test, args=(11, 22, 33, 44, 55, 66, 77, 88), kwargs={"mm":11}) p.start() if __name__ == "__main__": main()
5.多进程之间不共享全局变量
import multiprocessing import os import time nums = [11, 22, 33] def test(): nums.append(44) print("在进程中1中nums=%s" % str(nums)) time.sleep(3) def test2(): print("在进程中2中nums=%s" % str(nums)) def main(): print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid())) p = multiprocessing.Process(target=test) p.start() # time.sleep(1) p.join() p2 = multiprocessing.Process(target=test2) p2.start() if __name__ == "__main__": main()
6.多进程之间通过Queue来实现数据共享
import multiprocessing """ 一个进程向Queue中写入数据,另外一个进程从Queue中获取数据, 通过Queue完成了 多个需要配合的进程间的数据共享,从而能够 起到 解耦的作用 """ def download_from_web(q): """下载数据""" # 模拟从网上下载的数据 data = [11, 22, 33, 44] # 向队列中写入数据 for temp in data: q.put(temp) print("---下载器已经下载完了数据并且存入到队列中----") def analysis_data(q): """数据处理""" waitting_analysis_data = list() # 从队列中获取数据 while True: data = q.get() waitting_analysis_data.append(data) if q.empty(): break # 模拟数据处理 print(waitting_analysis_data) def main(): # 1. 创建一个队列 q = multiprocessing.Queue() # 2. 创建多个进程,将队列的引用当做实参进行传递到里面 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()
7.进程池
# -*- coding:utf-8 -*- from multiprocessing import Pool import os, time, random def worker(msg): t_start = time.time() print("%s开始执行,进程号为%d" % (msg,os.getpid())) # random.random()随机生成0~1之间的浮点数 time.sleep(random.random()*2) t_stop = time.time() print(msg,"执行完毕,耗时%0.2f" % (t_stop-t_start)) po = Pool(3) # 定义一个进程池,最大进程数3 for i in range(0,10): # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,)) # 每次循环将会用空闲出来的子进程去调用目标 po.apply_async(worker,(i,)) print("----start----") po.close() # 关闭进程池,关闭后po不再接收新的请求 po.join() # 等待po中所有子进程执行完成,必须放在close语句之后 print("-----end-----")
8.案例:多任务文件夹copy-v1
import os import multiprocessing def copy_file(file_name, old_folder_name, new_folder_name): """完成文件的复制""" print("======>模拟copy文件:从%s--->到%s 文件名是:%s" % (old_folder_name, new_folder_name, file_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() def main(): # 1. 获取用户要copy的文件夹的名字 old_folder_name = input("请输入要copy的文件夹的名字:") # 2. 创建一个新的文件夹 try: new_folder_name = old_folder_name + "[复件]" os.mkdir(new_folder_name) except: pass # 3. 获取文件夹的所有的待copy的文件名字 listdir() file_names = os.listdir(old_folder_name) print(file_names) # 4. 创建进程池 po = multiprocessing.Pool(5) # 5. 向进程池中添加 copy文件的任务 for file_name in file_names: po.apply_async(copy_file, args=(file_name, old_folder_name, new_folder_name)) po.close() po.join() if __name__ == "__main__": main()
9.案例:多任务文件夹copy-v2显示进度
import os import multiprocessing def copy_file(q, file_name, old_folder_name, new_folder_name): """完成文件的复制""" # print("======>模拟copy文件:从%s--->到%s 文件名是:%s" % (old_folder_name, new_folder_name, file_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. 获取用户要copy的文件夹的名字 old_folder_name = input("请输入要copy的文件夹的名字:") # 2. 创建一个新的文件夹 try: new_folder_name = old_folder_name + "[复件]" os.mkdir(new_folder_name) except: pass # 3. 获取文件夹的所有的待copy的文件名字 listdir() file_names = os.listdir(old_folder_name) # print(file_names) # 4. 创建进程池 po = multiprocessing.Pool(5) # 5. 创建一个队列 q = multiprocessing.Manager().Queue() # 6. 向进程池中添加 copy文件的任务 for file_name in file_names: po.apply_async(copy_file, args=(q, file_name, old_folder_name, new_folder_name)) po.close() # po.join() all_file_num = len(file_names) # 测一下所有的文件个数 copy_ok_num = 0 while True: file_name = q.get() # print("已经完成copy:%s" % file_name) copy_ok_num+=1 print("\r拷贝的进度为:%.2f %%" % (copy_ok_num*100/all_file_num), end="") if copy_ok_num >= all_file_num: break print() if __name__ == "__main__": main()
相关文章推荐
- 六、python学习之多任务-进程
- Python多任务-进程
- Python多任务——进程
- python多任务编程之OS模块创建父子进程
- python多任务(multiprocessing进程)
- Python- 线程和进程
- python 多进程使用Queue通信的例子
- python psutil跨平台监控系统或进程信息(CPU,mem)
- Linux守护进程设计规范及python实现http://blog.csdn.net/dysj4099/article/details/18219411
- python multiprocessing 创建多进程
- Python守护进程(daemon)代码实例
- python multiprocessing进程关键点
- Python笔记之进程和线程
- 用python编写daemon监控进程并自动恢复(附Shell版)
- Python爬虫(四):爬取136书屋小说,并保存至本地文本文件中,单进程多进程对比效率(以三生三世十里桃花为例)
- [转载]Python模块学习 ---- subprocess 创建子进程
- python 监控某个进程的进程数
- python for windows 获取进程列表 part2 (自学备注)
- Python获取shell管道数据/输入的2种方法: subprocess子进程 和 sys.stdin
- Python多进程并发操作中进程池Pool的应用