ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

沙雕系列——进程、线程、并发、并行(一)

2020-04-25 20:40:08  阅读:274  来源: 互联网

标签:__ work datetime 并发 线程 time print now 沙雕


作为小白的我,总是被多进程和多线程弄晕,当然,很多面试官也很喜欢问此类问题,针对这个问题,特意制作这个沙雕漫画来帮助小白的理解,同时加深对进程和线程的印象。
在这里插入图片描述
在这里插入图片描述

看完了以上的漫画,想必大家对进程线程有了一定的了解,那么接下来,我就举一个生活中常见的例子,来帮助小白的理解。
1.单核cpu
在这里插入图片描述
假设只有一个线程,来看看要用多久。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xueli
# @Software: win10 Tensorflow1.13.1 python3.6.3
import time
import datetime


def func1(work):
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(4)

def func2(work):
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(3)

def func3(work):
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(4)

def func4(work):
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(1)

if __name__ == '__main__':
    start = time.time()
    func1(u'煮饭')
    func2(u'炒菜')
    func3(u'洗衣服')
    func4(u'拖地')
    print("总时:" ,time.time() - start)

运行结果:
在这里插入图片描述
PS:单核单线程是为了帮助大家理解与记忆,现如今几乎没有单核CPU了吧。那么问题来了,什么是并发运行?什么是并行运行呢?

一张图解释一下什么是并发运行。
在这里插入图片描述
并发指的是应用能够交替执行不同的任务,并发的关键是你有处理多个任务的能力,不一定要同时进行,并发有点类似于多线程的原理,多线程并非是同时执行多个任务。如果你开多个线程执行,其实是计算机的操作系统通过时间片轮转法等算法调度执行任务,是在以我们无法感觉到的速度,在切换不同的任务程序。让我们误以为是"同时执行效果",但其实并不是这样的。并发类似于两个人交替使用一个一台电脑工作,轮流执行。

一张图解释一下什么是并行运行。
在这里插入图片描述
并行指应用能够同时执行不同的任务,并行的关键是你有同时处理多个任务的能力。并行类似于两个人使用两台电脑,同时进行工作。
并行和并发的区别点就在于,一个是交替执行,一个是同时执行。最关键的点在于,是否是“同时”。

接下来引入多线程:

import threading
import time
import datetime
import os

def func1(work):
    print('当前进程: {}'.format(os.getpid()))
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(4)
    print('%s,我已经完成了——>%s' % (datetime.datetime.now(), work))

def func2(work):
    print('当前进程: {}'.format(os.getpid()))
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(3)
    print('%s,我已经完成了——>%s' % (datetime.datetime.now(), work))

def func3(work):
    print('当前进程: {}'.format(os.getpid()))
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(4)
    print('%s,我已经完成了——>%s' % (datetime.datetime.now(), work))

def func4(work):
    print('当前进程: {}'.format(os.getpid()))
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(1)
    print('%s,我已经完成了——>%s' % (datetime.datetime.now(), work))


if __name__ == '__main__':
    print('当前主进程: {}'.format(os.getpid()))
    start = time.time()
    threads = []
    t1 = threading.Thread(target=func1, args=(u'煮饭',))
    threads.append(t1)
    t2 = threading.Thread(target=func2, args=(u'炒菜',))
    threads.append(t2)
    t3 = threading.Thread(target=func3, args=(u'洗衣服',))
    threads.append(t3)
    t4 = threading.Thread(target=func4, args=(u'拖地',))
    threads.append(t4)
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    print("共计用时{}秒".format((time.time()-start)))

运行结果:
在这里插入图片描述
这里博主举的多线程案例其实是并行运算啦。

2.多核CPU(以4核为例)
在这里插入图片描述

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/4/24 14:15
# @Author  : xueli
# @File    : process.py
# @Software: win10 Tensorflow1.13.1 python3.6.3

import time
import datetime
import os
from multiprocessing import Process

def func1(work):
    print('当前进程: {}'.format(os.getpid()))
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(4)
    print('%s,我已经完成了——>%s' % (datetime.datetime.now(), work))

def func2(work):
    print('当前进程: {}'.format(os.getpid()))
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(3)
    print('%s,我已经完成了——>%s' % (datetime.datetime.now(), work))

def func3(work):
    print('当前进程: {}'.format(os.getpid()))
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(4)
    print('%s,我已经完成了——>%s' % (datetime.datetime.now(), work))

def func4(work):
    print('当前进程: {}'.format(os.getpid()))
    print('%s,我现在要——>%s' %(datetime.datetime.now(),work))
    time.sleep(1)
    print('%s,我已经完成了——>%s' % (datetime.datetime.now(), work))


if __name__ == '__main__':
    print('当前主进程: {}'.format(os.getpid()))
    start = time.time()
    process = []
    p1 = Process(target=func1, args=(u'煮饭',))
    process.append(p1)
    p2 = Process(target=func2, args=(u'炒菜',))
    process.append(p2)
    p3 = Process(target=func3, args=(u'洗衣服',))
    process.append(p3)
    p4 = Process(target=func4, args=(u'拖地',))
    process.append(p4)
    for p in process:
        p.start()
    for p in process:
        p.join()
    print("共计用时{}秒".format((time.time()-start)))

运行结果:
在这里插入图片描述
这里创建了4个进程。由此可知,在这项工作中,单线程16秒,多线程4秒,多进程5.7秒。注意:进程与进程的切换要耗资源,所以平时工作中进程数不能开太大,进程数取决于CPU的核数。

持续更新~
如有问题,欢迎大佬给予批评指点。

标签:__,work,datetime,并发,线程,time,print,now,沙雕
来源: https://blog.csdn.net/zcs_xueli/article/details/105728342

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有