赞
踩
目录
多线程threading就是同时间、分批量安排Python去做很多东西,这样可以大大地节省计算的时间。
导入threading包
import threading
threading.active_count()
查询已有的线程thread的个数
threading.enumate()
查看已有的线程
threading.current_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方法的作用是确保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 模块即队列,特别适合处理信息在多个线程间安全交换的多线程程序中。
- 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 多线程的学习笔记,原视频链接如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。