多线程的概念
多线程的原理由来就没必要反反复复的讲了。之前的文章中是有写到的,也有写到多线程和多进程之间的区别,如果还不了解的请回看之前的文章:进程 线程 协程
python之单线程实现
接下来用python代码来模拟单线程执行的方式(ps:用下单和退款来比对)
import time
'''
分别模拟十次下单和退款
'''
def order(name):
for i in range(10):
print("%s正在付款第%d单" % (name, i+1))
time.sleep(1)
def refund(name):
for i in range(10):
print("%s正在退款中...第%d次退款" % (name, i+1))
time.sleep(1)
def mainDemo():
order('ctexthuang')
refund('ctexthuang')
if __name__ == '__main__':
print('任务开始!')
start = time.time()
mainDemo()
end = time.time()
print("任务结束,任务完成的时间为%d秒!" % (end-start))
运行结果如下:
任务开始!
ctexthuang正在付款第1单
ctexthuang正在付款第2单
ctexthuang正在付款第3单
ctexthuang正在付款第4单
ctexthuang正在付款第5单
ctexthuang正在退款中...第1次退款
ctexthuang正在退款中...第2次退款
ctexthuang正在退款中...第3次退款
ctexthuang正在退款中...第4次退款
ctexthuang正在退款中...第5次退款
任务结束,任务完成的时间为10秒!
可实际上我做功能肯定是希望退款和付款能同时操作的。但是这个只能按照顺序执行,这是不合理
python多线程实现方式
在我们python开发中常用的多线程实现方式基于两个模块,分别是_thread
、threading
(推荐这一种)
这两者有啥区别,python的_thread
模块是比较底层的模块,而threading
是基于_thread
模块做的一些封装,相对来说更加方便使用
实现的方式有两种
-
_thread.start_new_thread()
-
threading.Thread()
_thread.start_new_thread()
import time
import _thread
'''
分别模拟五次下单和退款
'''
def order(name):
for i in range(5):
print("%s正在付款第%d单" % (name, i+1))
time.sleep(1)
def refund(name):
for i in range(5):
print("%s正在退款中...第%d次退款" % (name, i+1))
time.sleep(1)
def mainMultithread():
"""函数式使用多线程"""
# 启动两个线程
orderThread = _thread.start_new_thread(order, ('ctexthuang', ))
playThread = _thread.start_new_thread(refund, ('ctexthuang', ))
if __name__ == '__main__':
print('任务开始!')
start = time.time()
mainMultithread()
'''防止子线程未运行'''
time.sleep(5)
end = time.time()
print("任务结束,任务完成的时间为%d秒!" % (end-start))
运行结果如下:
任务开始!
ctexthuang正在退款中...第1次退款
ctexthuang正在付款第1单
ctexthuang正在退款中...第2次退款
ctexthuang正在付款第2单
ctexthuang正在退款中...第3次退款
ctexthuang正在付款第3单
ctexthuang正在付款第4单
ctexthuang正在退款中...第4次退款
ctexthuang正在付款第5单
ctexthuang正在退款中...第5次退款
任务结束,任务完成的时间为5秒!
所能看见的就是我们同时进行了付款和退款两个操作。时间消耗量减少了一倍
但是也能发现顺序不一致,这是因为cpu分割线程执行时间的片块话导致的。
threading.Thread()
import time
import threading
'''
分别模拟五次下单和退款
'''
def order(name):
for i in range(5):
print("%s正在付款第%d单" % (name, i+1))
time.sleep(1)
def refund(name):
for i in range(5):
print("%s正在退款中...第%d次退款" % (name, i+1))
time.sleep(1)
def mainMultithread():
"""使用线程对象创建多线程"""
# 创建线程
orderThread = threading.Thread(target=order, args=('ctexthuang',))
playThread = threading.Thread(target=refund, args=('ctexthuang',))
# 启动线程
orderThread.start()
playThread.start()
if __name__ == '__main__':
print('任务开始!')
start = time.time()
mainMultithread()
'''防止子线程未运行'''
time.sleep(5)
end = time.time()
print("任务结束,任务完成的时间为%d秒!" % (end-start))
运行结果如下:
任务开始!
ctexthuang正在付款第1单
ctexthuang正在退款中...第1次退款
ctexthuang正在付款第2单ctexthuang正在退款中...第2次退款
ctexthuang正在退款中...第3次退款
ctexthuang正在付款第3单
ctexthuang正在退款中...第4次退款
ctexthuang正在付款第4单
ctexthuang正在付款第5单
ctexthuang正在退款中...第5次退款
任务结束,任务完成的时间为5秒!