Застрял с многопоточностью
я читаю несколько hdf5 файлов и эти hdf5 файлы будут иметь наборы данных в иерархии, я получаю данные из этих hdf5 файлов, я использую многопоточность внутри hdf5 файла для увеличения скорости чтения, также скажите как я могу сделать это быстро, мне нужно изменить структуру или способ чтения, я использую python 2.7 и django 1.8:
присутствует: их несколько client_id.hdf5 , внутри него несколько ship_ids -> report_types-> time_stamp-> в этих данных за это время
Я сделал это, он печатает только до получения данных. Запуск многопроцессорной обработки... ('Processing client:', 112):
Вместо использования подхода is_Alive, чтобы сделать его надежным и быстрым, вы можете переписать его с помощью фьючерсов
from concurrent.futures import ThreadPoolExecutor, as_completed
with ThreadPoolExecutor(max_workers=settings.WORKER_THREADS) as executor:
future = executor.submit(client_file, queue)
future_to_row[future] = row
for future in as_completed(future_to_row):
future.result()
Создайте очередь и отправьте на обработку значения, отличные от None.
Вы можете эффективно создать свой собственный пул потоков, создав некоторое количество потоков (назовем его NTHREADS) и сохраняя их в списке.
Когда поток потребляет None из очереди, это воспринимается как признак того, что поток должен прекратить обработку.
Что-то вроде этого:
from queue import Queue
from threading import Thread, Lock
NTHREADS = 4
def pthread(q, k):
# use a blocking get()
while (value := q.get()) is not None:
# acquire exclusive access to stdout
with k:
print(value)
if __name__ == "__main__":
q = Queue()
k = Lock()
# create a "pool" of NTHREADS threads
threads = [Thread(target=pthread, args=(q, k)) for _ in range(NTHREADS)]
# start the threads
for thread in threads:
thread.start()
# put some values on the queue
for x in range(10):
q.put(x)
# send None NTHREADS times to the queue
# when a thread consumes None from the queue, it terminates
for _ in range(NTHREADS):
q.put(None)
# wait for the threads to terminate
for thread in threads:
thread.join()
Возможный выход:
0
2
3
4
5
6
7
8
9
1