前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用最简单的例子和最通俗的语言解释单进程和多进程

用最简单的例子和最通俗的语言解释单进程和多进程

作者头像
一个有趣的灵魂W
发布2020-09-15 12:25:09
8590
发布2020-09-15 12:25:09
举报

采用网上的一个利用复制文件来检测多进程和单进程差异的例子。但是例子中许多关键的解释并未给出,反而给入门新手造成了很多不必要的困扰和门槛。

以下的解释重点有两个,1是怎么运行多进程(我测试了多台电脑,具体为什么运行不了,我也不知道,只能按照我自己的方法解释如何可以在我测试的几台电脑上运行)。2是关键性的代码解读。

第一个问题的解答:首先,创建两个工程文件,一个是单进程,一个是多进程。其中多进程无法使用选中部分代码然后ctrl+enter的方式运行,必须运行全部代码,在工程文件上方的运行按钮运行。

其中多进程代码:

# -*- coding: utf-8 -*-

"""

Created on Wed Aug 28 18:00:53 2019

@author: Administrator

"""

from multiprocessing import Pool,Manager

import time

import os

import shutil

import random

start = time.time()

def copyFile(file_name,old_folder_name,new_folder_name,q):

time.sleep(random.random())

shutil.copyfile(old_folder_name+"/"+file_name,new_folder_name+"/"+file_name,)

q.put(file_name)

def main():

pool = Pool(5)

q = Manager().Queue()

old_folder_name = 'D:/minxinan/temp1'

new_folder_name = 'D:/minxinan/temp2'

os.mkdir(new_folder_name)

file_name_list = os.listdir(old_folder_name)

for value in file_name_list:

pool.apply_async(copyFile,args=(value,old_folder_name,new_folder_name,q))

count = 0

allLength = len(file_name_list)

while count < allLength:

message = q.get()

count += 1

print("\r正在拷贝%s,拷贝的进度是:%d%%"%(message,(count/allLength)*100),end="")

print("\n拷贝完毕")

if __name__ == "__main__":

main()

end = time.time()

print("多进程花费的时间:%#.2fs"%(end-start))

其中,单进程代码

# -*- coding: utf-8 -*-

"""

Created on Sun Sep 1 21:54:57 2019

@author: Administrator

"""

import time

import os

import shutil

import random

start = time.time()

def copyFile(file_name,old_folder_name,new_folder_name):

time.sleep(random.random())

shutil.copyfile(old_folder_name+"/"+file_name,new_folder_name+"/"+file_name,)

def main():

old_folder_name = 'D:/minxinan/temp1'

new_folder_name = 'D:/minxinan/temp3'

os.mkdir(new_folder_name)

file_name_list = os.listdir(old_folder_name)

count = 0

allLength = len(file_name_list)

for value in file_name_list:

copyFile(value,old_folder_name,new_folder_name)

count += 1

print("\r正在拷贝%s,拷贝的进度是:%d%%" % (value, (count / allLength) * 100), end="")

print("\n拷贝完毕")

if __name__ == "__main__":

main()

end = time.time()

print("单进程花费的时间:%#.2fs"%(end-start))

运行结果对比:

对于第二部分的解释:

解释:

其中代码中的copyFile函数中有一句:

time.sleep(random.random())

这是造成时间差异的关键,是这句代码造成的文件复制速度慢(不论是单进程还是多进程),速度慢的目的是为了检验多进程速度比单进程快,为什么呢?因为

1, time.sleep相当于暂停,单进程复制50个文件,暂停了50次,而多进程复制只有暂停了12.5次,所以速度快了。

2,文件复制属于io密集型处理,不是多进程擅长的,如果把 time.sleep去掉,单进程的速度会比多进程快。

以上大致就是为什么加 time.sleep来测试多进程的原因。

我的内容已经很入门了。。。。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个有趣的灵魂W 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档