Python基础(一):threading多线程

目录

 

一、什么是多线程

二、添加线程

 2.1 threading常用方法

2.2 添加thread

三、join功能

 四、Queue功能

 五、不一定有效率

六、锁


一、什么是多线程

多线程threading就是同时间、分批量安排Python去做很多东西,这样可以大大地节省计算的时间。

二、添加线程

导入threading包

import threading

 2.1 threading常用方法

threading.active_count()

查询已有的线程thread的个数

threading.enumate()

查看已有的线程

threading.current_thread()

查看正在运行的线程

运行结果展示:

2.2 添加thread

import threading


def thread_job():
    print('This is an added Thread, which is %s' % threading.current_thread())


def main():
    # 添加一个线程
    added_thread = threading.Thread(target=thread_job)  # target表示要该线程要执行的任务
    # 启动线程
    added_thread.start()


if __name__ == '__main__':
    main()

运行结果:

三、join功能

join方法的作用是确保thread子线程执行完毕后才能执行下一个线程。

        - 不使用join方法的情况:

import threading
import time


def thread_job():
    print('T1 start\n')
    for i in range(10):
        # time.sleep() 函数推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间。
        time.sleep(0.1)
    print('T1 finish\n')


def main():
    added_thread = threading.Thread(target=thread_job, name='T1')
    added_thread.start()
    print('all done\n')


if __name__ == '__main__':
    main()

 运行结果:

这是因为,main()是一个线程,added_thread()也是一个线程,多线程运行时,main()不会等待added_thread()结束以后再运行。

        - 加入join的情况:

import threading
import time


def thread_job():
    print('T1 start\n')
    for i in range(10):
        time.sleep(0.1)
    print('T1 finish\n')


def main():
    added_thread = threading.Thread(target=thread_job, name='T1')
    added_thread.start()
    # 确保added_thread子线程执行完毕后才能执行下一个线程
    added_thread.join()
    print('all done\n')


if __name__ == '__main__':
    main()

 运行结果:

 四、Queue功能

queue 模块即队列,特别适合处理信息在多个线程间安全交换的多线程程序中。

import threading
from queue import Queue


arr = [[1, 1, 2], [2, 3, 4], [2, 3, 2], [1, 4, 5]]


def job(number, q):
    for i in range(len(number)):
        number[i] = number[i] ** 2
    q.put(number)


def multithreading(data):
    q = Queue()
    threads = []
    for i in range(4):
        t = threading.Thread(target=job, args=(data[i], q))
        t.start()
        threads.append(t)
    for thread in threads:
        thread.join()
    result = []
    for _ in range(4):
        result.append(q.get())
    print(result)


if __name__ == '__main__':
    multithreading(arr)

运行结果:

 五、不一定有效率

 多线程的工作原理:

import threading
from queue import Queue
import copy
import time


def job(l, q):
    res = sum(l)
    q.put(res)


def multithreading(l):
    q = Queue()
    threads = []
    for i in range(4):
        t = threading.Thread(target=job, args=(copy.copy(l), q), name='T%i' % i)
        t.start()
        threads.append(t)
    [t.join() for t in threads]
    total = 0
    for _ in range(4):
        total += q.get()
    print(total)


def normal(l):
    total = sum(l)
    print(total)


if __name__ == '__main__':
    l = list(range(1000000))
    s_t = time.time()
    normal(l*4)
    print('normal: ',time.time()-s_t)
    s_t = time.time()
    multithreading(l)
    print('multithreading: ', time.time()-s_t)

运行结果:

六、锁

import threading


def job1():
    global A, lock
    lock.acquire()
    for i in range(10):
        A += 1
        print('job1', A)
    lock.release()


def job2():
    global A, lock
    lock.acquire()
    for i in range(10):
        A += 10
        print('job2', A)
    lock.release()


if __name__ == '__main__':
    lock = threading.Lock()
    A = 0
    t1 = threading.Thread(target=job1)
    t2 = threading.Thread(target=job2)
    t1.start()
    t2.start()
    t1.join()
    t2.join()

 运行结果:

莫烦Python 多线程的学习笔记,原视频链接如下:

【莫烦Python】Threading 学会多线程 Python

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值