Ошибка глобального имени параллельного Python

1

Эй, я пытаюсь запустить простой код, который одновременно добавляет список чисел, используя Parallel Python

import sys, time
import pp
import numpy
x = numpy.arange(-20.0,20.0,0.5)
def function(raw_input):
    f = 0
    for i in numpy.arange(len(x)):
        f+=1
    a=raw_input[0]
    b=raw_input[1]
    c=raw_input[2]
    d=raw_input[3]
    print len(x)
    return (a+b+c+d)+f
# tuple of all parallel python servers to connect with
ppservers = ()
#ppservers = ("10.0.0.1",)

if len(sys.argv) > 1:
    ncpus = int(sys.argv[1])
    # Creates jobserver with ncpus workers
    job_server = pp.Server(ncpus, ppservers=ppservers)
else:
    # Creates jobserver with automatically detected number of workers
    job_server = pp.Server(ppservers=ppservers)
print "Starting pp with", job_server.get_ncpus(), "workers"

start_time = time.time()

# The following submits 4 jobs and then retrieves the results
puts = ([1,2,3,4], [3,2,3,4],[4,2,3,6],[2,3,4,5])

jobs = [(raw_input, job_server.submit(function,(raw_input,), (), ("numpy",))) for raw_input in puts]
for raw_input, job in jobs:
    print "Sum of numbers", raw_input, "is", job()

print "Time elapsed: ", time.time() - start_time, "s"
job_server.print_stats()

поэтому в основном я хочу, чтобы он добавлял [1,2,3,4] вместе, в то же время добавляя [3,2,3,4], [4,2,3,6], [2,3,4, 5]. И добавьте "f", которая равна длине x (что равно 80) ко всем ответам. выход должен выглядеть следующим образом:

Запуск pp с 4 рабочими

Сумма чисел [1, 2, 3, 4] равна 90

Сумма чисел [3, 2, 3, 4] равна 92

Сумма чисел [4, 2, 3, 6] равна 95

Сумма чисел [2, 3, 4, 5] равна 94

Прошло время: 0.394000053406 с

Статистика выполнения работ:

количество вакансий | % всех рабочих мест | сумма рабочего времени | время на работу | сервер заданий

     4 |        100.00 |       1.4380 |     0.359500 | local

Время, прошедшее с момента создания сервера 0.442999839783

проблема с им заключается в том, что с x вне "функции" оболочка возвращается с глобальным именем "x" не определена, но если вы поместите x в оболочку, она вернет полный массив x.

im confused, почему его четко определено достаточно, чтобы вернуть мне "x", когда я положил его в оболочку, но задание не находит x или что-то еще вне определения функции.

Теги:
parallel-processing

1 ответ

1

Я думаю, проблема в том, что x задан на сервере заданий (который работает в оболочке), но не у рабочих, потому что рабочие имеют доступ к переменным на своих входах.

Вы должны уметь это исправить, передав x в качестве дополнительного аргумента при отправке заданий.

Насколько я вижу, вычисление f всегда будет иметь результат len (x), поэтому вы можете просто передать значение для f:

import sys, time
import pp
import numpy
x = numpy.arange(-20.0,20.0,0.5)
def function(raw_input,f):
    a=raw_input[0]
    b=raw_input[1]
    c=raw_input[2]
    d=raw_input[3]
    return (a+b+c+d)+f
# tuple of all parallel python servers to connect with
ppservers = ()
#ppservers = ("10.0.0.1",)

if len(sys.argv) > 1:
    ncpus = int(sys.argv[1])
    # Creates jobserver with ncpus workers
    job_server = pp.Server(ncpus, ppservers=ppservers)
else:
    # Creates jobserver with automatically detected number of workers
    job_server = pp.Server(ppservers=ppservers)
print "Starting pp with", job_server.get_ncpus(), "workers"

start_time = time.time()

# The following submits 4 jobs and then retrieves the results
puts = ([1,2,3,4], [3,2,3,4],[4,2,3,6],[2,3,4,5])

jobs = [(raw_input, job_server.submit(function,(raw_input,len(x)), (), ("numpy",))) for raw_input in puts]
for raw_input, job in jobs:
    print "Sum of numbers", raw_input, "is", job()

print "Time elapsed: ", time.time() - start_time, "s"
job_server.print_stats()
  • 0
    Спасибо за ответ, я знаю, что f всегда будет одним и тем же, я пытался сделать простой пример извлечения переменной из-за пределов функции в вычислениях. настоящая цель на самом деле - это другой код с чем-то вроде этой сборки, и в нем есть переменные, которые меняются на каждой итерации, и вычисления внутри параллельного задания должны добавляться в массив, который также находится за пределами функции, поэтому я и не просто поместите x внутрь. Это может сработать, однако, если я смогу сделать массив или список частью аргументов, я думаю. Спасибо за помощь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню