python基础教程之多线程

多线程的概念

多线程的原理由来就没必要反反复复的讲了。之前的文章中是有写到的,也有写到多线程和多进程之间的区别,如果还不了解的请回看之前的文章:进程 线程 协程

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开发中常用的多线程实现方式基于两个模块,分别是_threadthreading(推荐这一种)
这两者有啥区别,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秒!
tag(s): python
show comments · back · home
Edit with markdown
召唤看板娘