Python3进阶-线程

线程和进程特性

并发和并型

并发:指系统具有处理多个任务(动作)的能力,一般结合硬件多核心处理

并行:并发的子集,具有同时处理多个任务(动作)的能力

同步与异步

同步:当进程执行到一个IO操作(等待外部数据),一同执行,就是同步

异步:当进程执行到一个IO操作(不等待外部数据),不管其他线程继续执行

线程 threading

定义

最小的执行单位,进程里边的虚拟微进程。

一个进程至少有一个线程

一个线程可以创建和撤销另外一个线程

同一个进程间的多个线程----并发执行

基本方法

方法 释义
start() 启动线程
isAlive() 返回线程是否活动
setName() 定义线程名称
getName() 返回线程名称
jion() 等待线程
setDeamon() 守护线程

start()

新开启动线程

import time
import threading        #线程模块
def HI(num):
    print("hello %s" %num)
    time.sleep(3)
if __name__ == '__main__':
    t1 = threading.Thread(target=HI, args=(10,))                #创建一个子线程【固定格式】
    t2 = threading.Thread(target=HI, args=(9,))                 #创建一个子线程【固定格式】
    t1.start()                                                  #执行线程
    t2.start()                                                  #执行线程
    print("end")
hello 10
hello 9
end

多线程示例

import time
import threading        #线程模块
def APP1():
    print("第一个应用  【开始时间】 %s" %time.ctime())
    time.sleep(3)
    print("第一个应用  【结束时间】 %s" % time.ctime())
def APP2():
    print("第二个应用  【开始时间】 %s" %time.ctime())
    time.sleep(5)
    print("第二个应用  【结束时间】 %s" % time.ctime())
if __name__ == '__main__':
    t1 = threading.Thread(target=APP1)                 #创建一个子线程对象【固定格式】
    t2 = threading.Thread(target=APP2)                 #创建一个子线程对象【固定格式】
    print("主线程")                                    #测试主线程和其它一起执行
t1.start()
t2.start()
主线程
第一个应用  【开始时间】 Sun Jun  3 15:08:07 2018
第二个应用  【开始时间】 Sun Jun  3 15:08:07 2018
第一个应用  【结束时间】 Sun Jun  3 15:08:10 2018
第二个应用  【结束时间】 Sun Jun  3 15:08:12 2018

列表整合多线程示例

import time
import threading        #线程模块
def APP1():
    print("第一个应用  【开始时间】 %s" %time.ctime())
    time.sleep(3)
    print("第一个应用  【结束时间】 %s" % time.ctime())
def APP2():
    print("第二个应用  【开始时间】 %s" %time.ctime())
    time.sleep(5)
    print("第二个应用  【结束时间】 %s" % time.ctime())

t1 = threading.Thread(target=APP1)                     #创建一个子线程对象【固定格式】
t2 = threading.Thread(target=APP2)                     #创建一个子线程对象【固定格式】
th_list = []                                           #建立空列表用于整合所有线程
th_list.append(t1)                                     #添加线程【t1】到列表中
th_list.append(t2)                                     #添加线程【t2】到列表中
print("主线程")                                        #测试主线程和其它一起执行
if __name__ == '__main__':
    for i in th_list:                                  #遍历列表中的所有线程
        i.start()                                      #执行线程
主线程
第一个应用  【开始时间】 Sun Jun  3 15:08:07 2018
第二个应用  【开始时间】 Sun Jun  3 15:08:07 2018
第一个应用  【结束时间】 Sun Jun  3 15:08:10 2018
第二个应用  【结束时间】 Sun Jun  3 15:08:12 2018

join()

等待进程 - 定义特定进程结束再继续执行程序代码【实现同步】

import time
import threading        #线程模块
def APP1():
    print("第一个应用  【开始时间】 %s" %time.ctime())
    time.sleep(3)
    print("第一个应用  【结束时间】 %s" % time.ctime())
def APP2():
    print("第二个应用  【开始时间】 %s" %time.ctime())
    time.sleep(5)
    print("第二个应用  【结束时间】 %s" % time.ctime())
if __name__ == '__main__':
    t1 = threading.Thread(target=APP1)                 #创建一个子线程对象【固定格式】
    t2 = threading.Thread(target=APP2)                 #创建一个子线程对象【固定格式】
t1.start()
t2.start()
t1.join()                   #定义等待【t1】进程结束再执行以下程序代码
t2.join()                   #定义等待【t2】进程结束再执行以下程序代码
print("主线程")
第一个应用  【开始时间】 Sun Jun  3 15:12:56 2018
第二个应用  【开始时间】 Sun Jun  3 15:12:56 2018
第一个应用  【结束时间】 Sun Jun  3 15:12:59 2018
第二个应用  【结束时间】 Sun Jun  3 15:13:01 2018
主线程

列表实现同步进程示例

import time
import threading        #线程模块
def APP1():
    print("第一个应用  【开始时间】 %s" %time.ctime())
    time.sleep(3)
    print("第一个应用  【结束时间】 %s" % time.ctime())
def APP2():
    print("第二个应用  【开始时间】 %s" %time.ctime())
    time.sleep(5)
    print("第二个应用  【结束时间】 %s" % time.ctime())

t1 = threading.Thread(target=APP1)                     #创建一个子线程对象【固定格式】
t2 = threading.Thread(target=APP2)                     #创建一个子线程对象【固定格式】
th_list = []                                           #建立空列表用于整合所有线程
th_list.append(t1)                                     #添加线程【t1】到列表中
th_list.append(t2)                                     #添加线程【t2】到列表中
if __name__ == '__main__':
    for i in th_list:                                  #遍历列表中的所有线程
        i.start()                                      #执行线程
    for l in th_list:
        l.join()
print("主线程")                                        #测试主线程和其它一起执行
第一个应用  【开始时间】 Sun Jun  3 15:12:56 2018
第二个应用  【开始时间】 Sun Jun  3 15:12:56 2018
第一个应用  【结束时间】 Sun Jun  3 15:12:59 2018
第二个应用  【结束时间】 Sun Jun  3 15:13:01 2018
主线程

setDeamon(True)

守护进程 - 和主线程一起结束

==注:当setDeamon状态【True】和【Flase】一同存在【Flase】生效==

import time
import threading        #线程模块
def APP1():
    print("第一个应用  【开始时间】 %s" %time.ctime())
    time.sleep(3)
    print("第一个应用  【结束时间】 %s" % time.ctime())
def APP2():
    print("第二个应用  【开始时间】 %s" %time.ctime())
    time.sleep(5)
    print("第二个应用  【结束时间】 %s" % time.ctime())
if __name__ == '__main__':
    t1 = threading.Thread(target=APP1)                 #创建一个子线程对象【固定格式】
    t2 = threading.Thread(target=APP2)                 #创建一个子线程对象【固定格式】
t2.setDaemon(True)                                     #守护第二个线程,主线程结束,第二个应用一同结束
t1.start()
t2.start()
print("主线程")
第一个应用  【开始时间】 Sun Jun  3 15:36:13 2018
第二个应用  【开始时间】 Sun Jun  3 15:36:13 2018
主线程
第一个应用  【结束时间】 Sun Jun  3 15:36:16 2018

猜你喜欢

转载自my.oschina.net/zhaojunhui/blog/1824643