Проблема синхронизации в параллельных вычислениях IPython - PullRequest
0 голосов
/ 15 декабря 2011

Недавно я хотел разработать границу HTTP-сервера, чтобы обернуть мою программу кластеризации ipcontroller / ipengine.Сервер является простым производным от BaseHTTPServer.Когда сервер получает HTTP-запрос Get, его метод do_GET вызовет несколько методов mec.execute () для завершения задания.Вот пример кода.

do_GET
{
b = parameter
mec.scatter("a", b)
mec.execute("c=fun(a)")
d = mec.gather("c")
write d
}

Буду ли я сталкиваться с проблемой синхронизации в операторе mec.execute ("c = fun (a)")?По моим предположениям, переменная "c" будет создана на каждом ipengie со значением "fun (a)".Если два потока вызывают метод do_Get одновременно с другим параметром, каково будет значение «c» для каждого из ipengine.

1 Ответ

1 голос
/ 17 декабря 2011

Если вы можете выразить задачу как один параллельный вызов функции, тогда вы должны быть в безопасности, потому что никакие другие запросы не могут проникнуть между ними (и не нужно трогать глобальные переменные движка), например:

from IPython import parallel

rc = parallel.Client()
view = rc[:]

@view.parallel(block=True)
def pfun(a):
    """each engine will get a chunk of a, not the whole thing"""
    c = fun(a)
    return c

# a will be scattered and c will be gathered
c = pfun(a)

Но если нет, то самое простое решение, вероятно, состоит в том, чтобы гарантировать отсутствие коллизий имен между заданиями, предоставляя переменным для данного запроса уникальный суффикс с UUID:

import uuid
suffix = str(uuid.uuid4()).replace('-','') # remove '-' so we have a valid identifier
a_name = "a_" + suffix
c_name = "c_" + suffix
mec.scatter(a_name, b)
mec.execute("%s = fun(%s)" % (c_name, a_name))
d = mec.gather(c_name)
...