Python3, мой пример многопроцессорности, где не выполняются параллельные процессы - PullRequest
2 голосов
/ 07 января 2012

Я новичок в многопроцессорности.Я изменил простой пример кода, где список отправляется рабочему подпроцессу, изменяется и отправляется обратно на печать.Я изменил его, чтобы проверить, работают ли несколько процессов параллельно, и возвращаются ли они после завершения каждого процесса.Я проверяю это, начиная с итогового значения [0], итогового значения [1], итого [2], итого [3] одновременно , но , заставляя ТОЛЬКО итоговое значение [2] приостановить перед возвратом.

Результат:
всего [0], всего [1] печати в скором времени.
всего [2] ждет (что и должно) НО итого [3] также ждет.

Вывод возвращается следующим образом:

['', 'DOCTYPE', 'HTML']
['LAST', 'NAV']
['TOPIC', 'FORUM']
['HEADLINE2', 'INNERHTML']

Когда я ожидал, что он вернется так:

['', 'DOCTYPE', 'HTML']
['LAST', 'NAV']
['HEADLINE2', 'INNERHTML']
['TOPIC', 'FORUM']

Как я уже сказал, я довольно новичок в подпроцессинге.Любая помощь приветствуется.Спасибо


код для моего примера

import multiprocessing as mp
import time



def worker(inq,outq):
    obj = inq.get()
    for b in range(len(obj)):
        obj[b] = obj[b].upper()

    if obj[0] == 'TOPIC': time.sleep(9)
    outq.put(obj)


total = [['', 'doctype', 'html'], ['last', 'nav'], ['Topic', 'forum'], ['headline2', 'innerHTML']]

if __name__=='__main__':
    inq = []
    outq = []
    p = []
    for i in range(len(total)):
        inq.insert(i, mp.Queue())
        outq.insert(i, mp.Queue())

        p.insert(i, mp.Process(target=worker, args=(inq[i],outq[i])))
        p[i].start()

        inq[i].put(total[i])


    for i in range(len(total)):
        # Wait for the worker to finish
        p[i].join()

        result1 = outq[i].get()

        print(result1)

1 Ответ

1 голос
/ 09 января 2012

В вашем последнем цикле for вы получаете результаты по порядку, поэтому, даже если 3 заканчивается до 2, вы сначала получаете результаты 2.

Попробуйте добавить строку print(obj) в конец worker(), чтобы увидеть, что 3 заканчивается первым.

...