案例1:
l1=[1,2,3,4,5,6]
for i in l1:
要求1:print(i)
要求2:每一个线程的频率不一样,time.sleep(i)
总结:创建多个线程,每个线程打印频率不一样;为了便于区分,每次打印的时候,可以加一个前缀,类似“线程1”、“线程2”、“线程3”…
1. 使用threading.Thread
类
我们可以创建threading.Thread
类的实例来表示一个线程,然后调用它的start()
方法来启动线程。这种方法的特点是简单直观,但缺点是每个线程都需要创建一个Thread
对象,可能会占用较多的内存资源。
import threading
import time
def print_num(i):
print(f"线程{
i}:{
i}")
time.sleep(i)
l1 = [1, 2, 3, 4, 5, 6]
threads = []
for i in l1:
t = threading.Thread(target=print_num, args=(i,))
t.start()
threads.append(t)
for t in threads:
t.join()
2. 使用concurrent.futures.ThreadPoolExecutor
类
concurrent.futures.ThreadPoolExecutor
类提供了一个线程池,可以自动管理线程的创建和销毁。这种方法的优点是更加高效,因为它可以避免频繁地创建和销毁线程。此外,它还提供了submit()
方法,可以方便地提交任务到线程池。
from concurrent.futures import ThreadPoolExecutor
import time
def print_num(i):
print(f"线程{
i}:{
i}")
time.sleep(i)
l1 = [1, 2, 3, 4, 5, 6]
with ThreadPoolExecutor(max_workers=len(l1)) as executor:
for i in l1:
executor.submit(print_num, i)
3. 使用queue.Queue
类
queue.Queue
类提供了一个线程安全的队列,我们可以将任务放入队列中,然后让多个线程从队列中取出任务并执行。这种方法的优点是可以实现任务的生产者-消费者模型,适用于需要处理大量任务的场景。
import queue
import threading
import time
def worker(q):
while True:
i = q.get()
if i is None:
break
print(f"线程{
i}:{
i}")
time.sleep(i)
q.task_done()
l1 = [1, 2, 3, 4, 5, 6]
q = queue.Queue()
threads = []
for i in l1:
q.put(i)
for i in range(len(l1)):
t = threading