Как получить все значения, возвращенные из многопроцессорной обработки в кортеже в Python - PullRequest
1 голос
/ 26 сентября 2019

Как мы можем сделать кортеж ВСЕХ результатов, созданных из "я в диапазоне (x) что-то сделать", используя многопроцессорность?

Попробовал простую многопроцессорность, но не может найти способ получить результатыв одной переменной кортежа.

Я предполагаю, что многопроцессорная обработка для моего случая, скажем, для создания кортежа из 10000 строк, должна работать быстрее при использовании многопроцессорной обработки, чем просто со стандартным кодом "для i в ragne [x] makeновую строку и добавить ее ... "?Например, если вместо 10000 строк мне нужно было создать 10000 строковых результатов, каждый из которых требовал тяжелой работы ЦП?

import random, string, time, multiprocessing

def randomString(stringLength=10):
    """Generate a random string of fixed length """
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for i in range(stringLength))

def worker(num):
    workdone = randomString(20)
    print("Worker: ", num, "Workdone: ", workdone)
    return # how do I return the workdone string?

if __name__ == '__main__':
    starttime = time.time()

    jobs = []
    Alladdr = []
    for i in range(10):
        p = multiprocessing.Process(target=worker, args=(i,))

        # How do I create a tuple (let's call it Totalworkdone) of all workdone results?

        jobs.append(p)
        p.start()

    # print()
    # print("All workdone = ", Totalworkdone) # Totalworkdone should be the tuple of ALL the workdone ever created in my loop
    print()
    print('That took {} seconds'.format(time.time() - starttime))

Привет всем.Мне нужно получить все результаты, созданные работником с использованием многопроцессорной обработки, в одном «большом» кортеже.

Например, если «for i in range [20]» заставляет работника создавать 20 случайных строк, мне нужно иметь возможность работать с переменной Totalworkdone, которая является кортежем ВСЕХ строк, созданныхработник.Мне все равно, если они в случайном порядке, это нормально.

Любая помощь приветствуется, но, пожалуйста, воздержитесь от URL-адресов, указывающих на длинный и запутанный код, так как я новичок, пытающийся сделать только что вышеперечисленное, чтобы я мог учиться и двигаться вперед.Спасибо всем заранее.

1 Ответ

0 голосов
/ 27 сентября 2019

Используйте очередь для передачи всех данных, а затем просто объедините их в кортеж.

import random, string, time, multiprocessing
from multiprocessing import Queue

def randomString(stringLength=10):
    """Generate a random string of fixed length """
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for i in range(stringLength))

def worker(num, out_queue):
    workdone = randomString(20)
    print("Worker: ", num, "Workdone: ", workdone)
    out_queue.put(workdone)

if __name__ == '__main__':
    starttime = time.time()
    out_queue = Queue()


    jobs = []
    Alladdr = []
    for i in range(10):
        p = multiprocessing.Process(target=worker, args=(i, out_queue))
        jobs.append(p)
        p.start()


    result = []
    for i in range(10):
        val = out_queue.get(block=True) # wait for the next item
        result.append(val)

    for p in jobs:
        p.join() # wait for finish of jobs

    Totalworkdone = tuple(result)


    # print()
    # print("All workdone = ", Totalworkdone) # Totalworkdone should be the tuple of ALL the workdone ever created in my loop
    print()
    print('That took {} seconds'.format(time.time() - starttime))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...