Добавление if __name__ == '__main__':
в runfile заставило код выполнить и получить "некоторые" результаты.Но при дополнительном тестировании кажется, что используется только одно ядро (или у меня что-то не так в коде)
import test_mp
if __name__ == '__main__':
X = test_mp.get_training_data_mp()
print([x.shape[0] for x in X])
test_mp.py
import multiprocessing
from multiprocessing import Process,Queue,Lock
import time
import numpy as np
TRAINING_DATA_LENGTH = 10e3
def get_training_data_mp(testing = False,updating = False):
s = time.time()
processes = []
output = Queue()
X = []
x = [X,X,X,X]
output.put(x)
lock = Lock()
for i in range(multiprocessing.cpu_count()):
p = Process(target=_test,args=(i,testing,updating,5000,1000,lock,output))
p.daemon = True
p.start()
processes.append(p)
while all([p.is_alive() for p in processes]):
lock.acquire()
x = output.get()
print([len(X) for X in x])
output.put(x)
lock.release()
time.sleep(3)
print([p.is_alive() for p in processes])
# for process in processes:
# process.join()
print('finished')
x = output.get()
my_x = x
e = time.time()
print(e-s)
return my_x
def _test(i,testing,updating,max_test_amount,max_train_amount_from_last_days,lock,output):
time.sleep(2) # long work
lock.acquire()
x = output.get()
X = x[i]
while (((not testing or updating) and len(X)<TRAINING_DATA_LENGTH) or
(testing and len(X)<max_test_amount)):
x[i] = X
output.put(x)
lock.release()
y = np.array(np.random.randint(0,10000,size=(2500, 4)))
time.sleep(2) # main long work
lock.acquire()
X = output.get()
X = x[i]
if len(X) == 0:
X = y
else:
X = np.append(X,y,axis=0)
# correcting output
time.sleep(0.5) # short work
x[i] = X
output.put(x)
lock.release()
с multiprocessing.dummy
Iполучить следующий вывод:
[0, 0, 0, 0]
[5000, 0, 5000, 0]
[False, True, True, True]
finished
7.50442910194397
[10000, 7500, 7500, 2500] # All processes were obtaining data <- intended
с multiprocessing
Its:
[0, 0, 0, 0]
[0, 0, 2500, 0]
[0, 10000, 0, 0]
[False, False, True, False]
finished
12.15569543838501
[0, 0, 10000, 0] # Only one process was obtaining data <- wrong
Решено
time.sleep()
не нагружает процессор, но при его переключениидля функции типа
def sleep():
n = 0
for i in range(6000):
n = i**i
результаты как multiprocessing.dummy
, так и multiprocessing
соответствуют ожидаемым - оба возвращают одинаковую длину, но многопроцессорность в N раз быстрее