我想通过在 Python 中使用多线程对同一列表中的元素做一些事情。例如,同时下载列表中的 3 个文件。
这是我的代码:
import threading
import time
thread_count = 3
l = [x for x in range(0, 10)]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
def do_sth(x):
print('%sn' % x)
time.sleep(1)
def worker():
for x in l:
l.remove(x)
do_sth(x)
threads = []
for x in range(0, thread_count):
t = threading.Thread(target=worker)
threads.append(t)
for t in threads:
t.start()
print('Started: %s' % t)
但是在输出中总有一些东西消失了:
Started: <Thread(Thread-6, started 5924)>
0
1
Started: <Thread(Thread-7, started 2860)>
2
Started: <Thread(Thread-8, started 15648)>
4
5
6
8
9
列表不是线程安全的(这意味着,如果您有多个线程/进程使用单个列表,则存在并发问题(。请改用队列。以下是适合您的用例的文档示例:
import threading
import time
import queue
q = queue.Queue()
def worker():
while True:
x = q.get()
if x is None:
break
do_sth(x)
q.task_done()
def do_sth(x):
print(x)
time.sleep(1)
threads = []
thread_count = 3
for x in range(0, thread_count):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
print('Started: %s' % t)
for x in range(0, 10):
q.put(x)
# block until all tasks are done
q.join()
# stop workers
for _ in threads:
q.put(None)
for t in threads:
t.join()