Как игнорировать задержку в подпроцессе при создании общего списка в python-multiprocess.manager.list ()? - PullRequest
0 голосов
/ 31 марта 2019

В моем 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...