专栏首页一个有趣的灵魂W用最简单的例子和最通俗的语言解释单进程和多进程

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

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

以下的解释重点有两个,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来测试多进程的原因。

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

本文分享自微信公众号 - 一个有趣的灵魂W(bourgeous),作者:F君的小尾巴

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一些小笔记(1)图文无关哦

    os.walk 遍历文件夹(含子文件夹),os.listdir遍历文件(不含子文件夹)

    一个有趣的灵魂W
  • 零散的pandas、numpy功能整理,包括机器学习的部分库

    df1 = pd.DataFrame([['张三', 10, '男'], ['李四', 11, '男'], ['王五', 11, '女'],['赵六', 10,...

    一个有趣的灵魂W
  • 手把手用python教你拿即时的卫星影像装饰你的桌面

    天天看着你们可爱的桌面腻不腻?天天看Windows推送的桌面腻不腻?天天对着动漫diss腻不腻?给你们推一个新视角~从天上往下看!偶尔对着台风可以说一声,你di...

    一个有趣的灵魂W
  • 手把手教你如何用飞桨自动生成二次元人物头像

    每次生成一组shape为[1,72]的随机数,更改其中某个数值,依次生成20组随机数,作为生成网络的输入,得到横向对比图片,观察GAN带来的神奇效果,如下所示。

    用户1386409
  • Python局部变量与全局变量区别原理解析

    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。 当全局变量与局部变...

    砸漏
  • python-字符串数据类型内置方法

    py3study
  • 安静100分钟理解js面向对象

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head>...

    前朝楚水
  • python变量,输入、输出、判断、循环

    声明变量 name = 'ajune' 变量赋值 name = 'ajune' name1 = name

    py3study
  • jQuery中调用JSON和XML数据--jQuery基础知识点(6)

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • 移动端常用的meta总结

    声明viewport视口 viewport对于移动端设备来说非常的重要,用于定义视口的各种行为。其中最为重要的就是要设定一个展示页面的宽度width=devi...

    河湾欢儿

扫码关注云+社区

领取腾讯云代金券