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) + '秒')

你可能感兴趣的:(2018-11-29 Day19)