Задать вопрос
@Selfeducation

Как из потока записать данные в массив?

Добрый день, интересует вопрос... Как можно записать данные из потока в массив который находиться в главном потоке. Перепробовал несколько вариантов, но увы...
К примеру для большего понимания моей проблемы...
import threading

arr = []

def Run():
    arr.append("For test")

t = threading.Thread(target=Run)
t.start()

Была идея использовать
threading.Lock()
но не помогло. Так же думал на счет callback функций, но если я не ошибаюсь потом в таком случае должен окончательно прекратить свою работу и вернуть результат, но в моем случае поток должен продолжать существовать и от времени записывать данные в
arr

Спасибо заранее.
  • Вопрос задан
  • 84 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@deliro
А зачем тебе вообще что-то кроме самого списка? Все встроенные коллекции (list, dict, set) уже являются потокобезопасными. Это значит, что если у тебя в список [1, 2] два потока примерно в одно время попытаются добавить 3 и 4 соответственно, то результирующий список будет [1, 2, 3, 4] или [1, 2, 4, 3]. Никуда ничего не пропадёт.

Другое дело, что код, который ты привёл, не дожидается конца выполнения потока.

from threading import Thread

l = []

def target(x):
    l.append(x**2)
    
threads = []
for i in range(10):
    t = Thread(target=target, args=(i, ))
    t.start()
    threads.append(t)
    
for t in threads:
    t.join()
    
print(l)


Но я бы задумался о том, зачем тебе такой код. Пока он выглядит костыльно. Есть куда более высокоуровневые штуки вроде ThreadPoolExecutor
Ответ написан
@antonksa
Какие данные, важен ли их порядок, сколько их (байты, килобайты, терабайты), сколько потоков, сколько это должно работать (секунду, минуту, вечность), откуда эти данные берутся, куда эти данные сохраняются.

Вопрос поставлен максимально расплывчато и на него можно получить два десятка абсолютно разных, и при этом верных для своего конечного контекста, решений.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы