В моем main () есть обращение, где я создаю подпроцесс многопроцессорным способом для запуска функции 'func'. А функция func будет стоить 2 секунды, чтобы добавить объект в список, который используется основным процессом и подпроцессом multiprocess.Manager (). List ().
В основном я должен получить новый объект (последний в общем списке). Я хочу, чтобы подпроцесс помог обновить список. Это означает, что примерно каждые 2 секунды я могу получить новый объект из списка, и основной процесс не имеет задержки.
Но, как показывает приведенный ниже код, я обнаружил, что всегда получаю 3, что означает, что я никогда не получаю новый объект в списке. Кажется, что каждый раз, когда основной процесс завершает подпроцесс, прежде чем он завершит свою работу (2 с).
Но я не могу вывести подпроцесс из обращения, потому что функция должна выполняться с основным обращением.
Интересно, есть ли способ решить мой вопрос? Я получил представление о 2-м показанном коде. Но я не знаю, как судить, работает ли последний подпроцесс, чтобы избежать неправильного завершения (), и мне интересно, возможна ли такая идея решения?
Постскриптум это не проблема синхронизации, потому что не имеет значения, является ли последний объект в списке не самым новым. Я просто хочу игнорировать задержку в функции подпроцесса и убедиться, что подпроцесс обновил список.
THX A LOT!
import multiprocessing
import time
import numpy as np
def func(mylist):
"""
this function costs 2s to append a object in the list
"""
time.sleep(2)
mylist.append(4)
mylist.append(5)
if __name__=="__main__":
sample1 = 1
sample2 = 2
sample3 = 3
samplesList = [sample1,sample2,sample3]
for i in range(10000):
with multiprocessing.Manager() as MG:
mylist=MG.list(samplesList) # parent and child process share this list
p=multiprocessing.Process(target=func,args=(mylist,))
p.start()
print(mylist[-1]) #what I wanna get is the last objet in the list
p.terminate()
и я думаю, что это можно изменить следующим образом:
if __name__=="__main__":
sample1 = 1
sample2 = 2
sample3 = 3
samplesList = [sample1,sample2,sample3]
with multiprocessing.Manager() as MG:
for i in range(10000):
if 'subprocess isworking now':
pass
else:
mylist=MG.list(samplesList) # parent and child process share this list
p=multiprocessing.Process(target=func,args=(mylist,))
p.start()
for i in range(10000):
print(mylist[-1]) #what I wanna get is the last objet in the list