2018-11-29 Day19

一.进程和线程的意义

1.进程: 正在执行的程序
特点: 相互独立 占用受保护独立的内存单元

2.线程: 进程想要执行任务,必须的有线程
一个进程的所有认为都是在线程中进行的
特点: 串行(一个一个按顺序去执行任务)

3.多线程
特点: 并行(每条线程可以同时执行不同的任务)
原理:
1.同一时间,cpu只能处理一条线程, 只有一条线程在工作.
2.多线程并发执行,其实是cpu在快速地在多线程之间调度.
3.cpu调度线程的时间足够快,造成了多线程并发的假象.

二.耗时操作

一个进程默认有一个线程,这个线程叫主线程.
默认情况下, 所有的代码都是在主线程里面进行的.

import time, datetime.

def down_load(film_name):
    print('开始下载%s' % film_name, '开始时间:%s' % datetime.datetime.now())
    time.sleep(5) # 程序执行到这个地方,线程会阻塞5秒,再执行后面膜的代码
    print('%s 下载结束' % film_name,'结束时间:%s' % datetime.datetime.now())


if __name__ == '__main__':
    down_load('小黄人')
    down_load('地心历险记')

三.多线程方法1:通过Thread类创建子线程

python通过threading模块

默认创建的线程叫主线程, 自己创建的线程叫子线程
如果希望代码在子线程里面执行,必须手动创建子线程对象

import threading
import time, datetime

def down_load(film_name):
    print('开始下载%s' % film_name, '开始时间:%s' % datetime.datetime.now())
    time.sleep(5) # 程序执行到这个地方,线程会阻塞5秒,再执行后面膜的代码
    print('%s 下载结束' % film_name,'结束时间:%s' % datetime.datetime.now())
    print('下载%s' % film_name, threading.current_thread())
if __name__ == '__main__':
    # down_load('小黄人')

    # 1.创建线程对象
    """
    Thread - 线程类
    Thread(target=函数名, args=参数列表) - 直接创建线程对象
    函数名 = 需要在当前线程执行的函数变量
    参数列表(要求是元组) = 元祖, 元祖的元素是函数的参数
    """
    t1 = threading.Thread(target=down_load, args=('小黄人',))
    t2 = threading.Thread(target=down_load, args=('小绿人',))
    # 2. 在子线程中执行任务

    """
    这里是调用down_load函数,并且传递一个参数'小黄人'
    """
    t1.start()
    t2.start()

四.多线程方法2: 通过Thread的子类创建子线程.

import datetime, time, threading
"""
除了直接创建Thread的对象,还可以继承这个类的对象


注意: 一个进程中有多个线程,进程会在所有的线程都结束才会结束
    线程中的任务执行完了,线程就结束
"""

class Thread1(threading.Thread):
    def __init__(self, film_name):
        super().__init__()
        self.film_name = film_name
    # 2.重写run方法
    def run(self):
        print('开始下载%s' % self.film_name , '开始时间:%s' % datetime.datetime.now())
        time.sleep(5)  # 程序执行到这个地方,线程会阻塞5秒,再执行后面膜的代码
        print('%s 下载结束' % self.film_name , '结束时间:%s' % datetime.datetime.now())
        print(threading.current_thread())

# 创建线程对象
t1 = Thread1('小黄人')
# 4.通过线程对象调用start在子线程重执行run方法
t1.start()
# 直接调用run方法会在主线程执行

五.join函数

"""
线程对象.join() - 等待线程对象中的任务执行完成
"""
from threading import Thread
import  datetime, time, random

class DownLoad(Thread):
   def __init__(self, film_name):
       super().__init__()
       self.film_name = film_name

   def run(self):
       print('开始下载%s'% self.film_name)
       a = random.randint(5,12)
       time.sleep(a)
       print('下载结束%s' % self.film_name, '耗时%d秒'% a)

if __name__ == '__main__':
   t1 = DownLoad('小黄人')
   t2 = DownLoad('小绿人')
   time1 = time.time()
   t1.start()
   t2.start()
   # t1和t2的任务都执行完成后才会执行后面的代码
   t1.join()
   t2.join()
   time2 = time.time()
   print('总共时间:',str(time2 - time1) + '秒')
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 9,681评论 0 23
  • 文/tangsl(简书作者) 原文链接:http://www.jianshu.com/p/2b993a4b913e...
    西葫芦炒胖子阅读 9,246评论 0 5
  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    胜浩_ae28阅读 10,576评论 0 23
  • 现在很多的年轻人都谈恋爱 我不知道这是好的还是坏的 很多的年轻人都期待自己有一个由校服走到婚纱的人 但是这条路真的...
    余沧焱阅读 3,188评论 0 0
  • 【六项精进打卡】 2018.10.03 姓名:陈岗 企业名称:上海孚因流体动力设备股份有限公司 打卡第163天 【...
    我心依旧_79e2阅读 1,135评论 0 0

友情链接更多精彩内容