многопроцессное закрепление Python - PullRequest
4 голосов
/ 26 июля 2011

В настоящее время я использую многопроцессный python для простого параллельного программирования. Я использую асинхронный декоратор

def async(decorated):
    module = getmodule(decorated)
    decorated.__name__ += '_original'
    setattr(module, decorated.__name__, decorated)
    def send(*args, **opts):
        return async.pool.apply_async(decorated, args, opts)
    return send

, а затем

@async
def evalfunc(uid, start, end):
        veckernel(Posx, Posy, Posz, Quant, Delta)
        return (uid, GridVal)

def runit(outdir):
    async.pool = Pool(8)
    results = []
    for uid in range(8):
        result = evalfunc(uid,Chunks[uid], Chunks[uid+1])
            results.append(result)

Если я запускаю это на 8-ядерном или 8-ядерном компьютере, он, по сути, использует только два ядра. Это почему? Есть ли способ сделать правильное закрепление ядра, как с помощью pthreads?

Большое спасибо, Mark

1 Ответ

1 голос
/ 26 июля 2011

Если функция, вызываемая apply_async (например, evalfunc), завершается очень быстро, то все рабочие процессы в пуле могут не использоваться.

Если это действительно ваша ситуация, то вам нужно передавать больше данных для каждого вызова evalfunc, чтобы у каждого процесса было больше возможностей для пережевывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...