当前位置:   article > 正文

Python基础(一):threading多线程_python threading

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

  1. import threading
  2. def thread_job():
  3. print('This is an added Thread, which is %s' % threading.current_thread())
  4. def main():
  5. # 添加一个线程
  6. added_thread = threading.Thread(target=thread_job) # target表示要该线程要执行的任务
  7. # 启动线程
  8. added_thread.start()
  9. if __name__ == '__main__':
  10. main()

运行结果:

三、join功能

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

        - 不使用join方法的情况:

  1. import threading
  2. import time
  3. def thread_job():
  4. print('T1 start\n')
  5. for i in range(10):
  6. # time.sleep() 函数推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间。
  7. time.sleep(0.1)
  8. print('T1 finish\n')
  9. def main():
  10. added_thread = threading.Thread(target=thread_job, name='T1')
  11. added_thread.start()
  12. print('all done\n')
  13. if __name__ == '__main__':
  14. main()

 运行结果:

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

        - 加入join的情况:

  1. import threading
  2. import time
  3. def thread_job():
  4. print('T1 start\n')
  5. for i in range(10):
  6. time.sleep(0.1)
  7. print('T1 finish\n')
  8. def main():
  9. added_thread = threading.Thread(target=thread_job, name='T1')
  10. added_thread.start()
  11. # 确保added_thread子线程执行完毕后才能执行下一个线程
  12. added_thread.join()
  13. print('all done\n')
  14. if __name__ == '__main__':
  15. main()

 运行结果:

 四、Queue功能

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

  1. import threading
  2. from queue import Queue
  3. arr = [[1, 1, 2], [2, 3, 4], [2, 3, 2], [1, 4, 5]]
  4. def job(number, q):
  5. for i in range(len(number)):
  6. number[i] = number[i] ** 2
  7. q.put(number)
  8. def multithreading(data):
  9. q = Queue()
  10. threads = []
  11. for i in range(4):
  12. t = threading.Thread(target=job, args=(data[i], q))
  13. t.start()
  14. threads.append(t)
  15. for thread in threads:
  16. thread.join()
  17. result = []
  18. for _ in range(4):
  19. result.append(q.get())
  20. print(result)
  21. if __name__ == '__main__':
  22. multithreading(arr)

运行结果:

 五、不一定有效率

 多线程的工作原理:

  1. import threading
  2. from queue import Queue
  3. import copy
  4. import time
  5. def job(l, q):
  6. res = sum(l)
  7. q.put(res)
  8. def multithreading(l):
  9. q = Queue()
  10. threads = []
  11. for i in range(4):
  12. t = threading.Thread(target=job, args=(copy.copy(l), q), name='T%i' % i)
  13. t.start()
  14. threads.append(t)
  15. [t.join() for t in threads]
  16. total = 0
  17. for _ in range(4):
  18. total += q.get()
  19. print(total)
  20. def normal(l):
  21. total = sum(l)
  22. print(total)
  23. if __name__ == '__main__':
  24. l = list(range(1000000))
  25. s_t = time.time()
  26. normal(l*4)
  27. print('normal: ',time.time()-s_t)
  28. s_t = time.time()
  29. multithreading(l)
  30. print('multithreading: ', time.time()-s_t)

运行结果:

六、锁

  1. import threading
  2. def job1():
  3. global A, lock
  4. lock.acquire()
  5. for i in range(10):
  6. A += 1
  7. print('job1', A)
  8. lock.release()
  9. def job2():
  10. global A, lock
  11. lock.acquire()
  12. for i in range(10):
  13. A += 10
  14. print('job2', A)
  15. lock.release()
  16. if __name__ == '__main__':
  17. lock = threading.Lock()
  18. A = 0
  19. t1 = threading.Thread(target=job1)
  20. t2 = threading.Thread(target=job2)
  21. t1.start()
  22. t2.start()
  23. t1.join()
  24. t2.join()

 运行结果:

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/768784
推荐阅读
相关标签
  

闽ICP备14008679号