Python - Делайте вещи с элементами в списке, используя многопоточность - PullRequest
0 голосов
/ 01 октября 2018

Я хочу сделать что-то для элемента в том же списке, используя многопоточность в 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('%s\n' % 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

1 Ответ

0 голосов
/ 01 октября 2018

Списки не являются потокобезопасными (это означает, что существуют проблемы с параллелизмом, если у вас несколько потоков / процессов, использующих один список).Вместо этого используйте Queue .Вот пример из документов, адаптированных к вашему варианту использования:

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()
...