python多線程的使用
后續(xù)還會(huì)更新其他方法實(shí)現(xiàn)的多線程。
Queue實(shí)現(xiàn)多線程
通過(guò)隊(duì)列實(shí)現(xiàn)多線程
- 啟動(dòng)一定數(shù)量的線程(個(gè)數(shù)自己定義),線程都是從隊(duì)列中獲取數(shù)據(jù)去執(zhí)行的。
- 依次往隊(duì)列中加入數(shù)據(jù)。
#啟動(dòng)隊(duì)列
#my_threading.py
from queue import Queue
from Thread_Worker import Thread_Worker
from Thread_Task import get_task
THREAD_NUM = 10
queue_task = Queue() #一個(gè)隊(duì)列
for thread_num in range(THREAD_NUM):
#啟動(dòng)一定數(shù)量的線程
thread_work = Thread_Worker(queue_task)
thread_work.daemon = True #設(shè)置為守護(hù)線程,在進(jìn)程退出時(shí)不用等待這個(gè)線程退出。
thread_work.start()
for each_task in get_task():
#往隊(duì)列中加入任務(wù)數(shù)據(jù)
queue_task.put(each_task)
queue_task.join()
#Thread_Worker.py
from threading import Thread
import time
def start_task(task_num):
#自定義的需要多線程跑的任務(wù)
print("this is task {}".format(task_num))
time.sleep(5)
print("task {} is done".format(task_num))
class Thread_Worker(Thread):
def __init__(self, queue_task):
super(Thread_Worker, self).__init__()
self.queue_task = queue_task
def run(self):
while True:
task = self.queue_task.get()
start_task(task)
self.queue_task.task_done()
#### 標(biāo)題
#在完成一項(xiàng)工作之后,Queue.task_done()函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個(gè)信號(hào)
#Thread_Task.py
def get_task():
for i in range(20):
yield(i)
輸出
python my_threading.py
python my_threading.py
輸出結(jié)果