Вам придется довольно тщательно реструктурировать свой скрипт, чтобы реализовать multiprocessing
.Основной сценарий будет выглядеть примерно так:
from multiprocessing import Process, JoinableQueue, Manager
def my_function(input_queue, manager_list):
while True:
item_to_process = input_queue.get() # item_to_process will be an (index, item) tuple
result_of_processing = item_to_process[1] ** 2
manager_list[item_to_process[0]] = result_of_processing
input_queue.task_done()
def main():
item_count = 10 # 10000 in your case
my_variable = [i for i in range(item_count)]
q = JoinableQueue()
for index, item in enumerate(my_variable):
q.put((index, item))
manager = Manager()
results = manager.list([0] * item_count) # initialize to same size as my_variable
worker_count = 2
for _ in range(worker_count):
p = Process(target=my_function, args=[q, results])
p.daemon = True # optional, but should be used unless your subprocess will spawn another process
p.start()
# now you can continue on
# but when you need to access `results` you have to put:
q.join()
# now we have our results
print(results)
if __name__ == "__main__":
main()
Yeilding
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
В моем простом случае.
Вы также можете использовать пул, но я не очень разбираюсь в этом и не хотел бы вводить вас в заблуждение.
Главное, на что нужно обращать внимание при использовании многопроцессорной обработки, - это избегатьвзаимоблокировки, а также поддержание разделяемой памяти, и это может быть сложно быстро!В большинстве случаев было бы достаточно и рекомендуется вместо этого использовать threading.Thread
!Этот модуль очень прост в использовании, но вам все равно, вероятно, понадобится queue.Queue
.Однако вам не придется беспокоиться о совместном использовании памяти и таких вещах, как multiprocessing.Manager
s