2016-10-11 1 views
1

Я прочитал эту документацию python по адресу multiprocessing.Как сделать две функции сопоставления параллельными?

Но у меня был требование, как следующее:.

from multiprocessing import Pool 
import time 

def f(x): 
    print(x) 
    time.sleep(100000000000000); 
    return x*x 

def f2(x): 
    print('**' + str(x) + '**') 
    time.sleep(100000000000000); 
    return x*x*x; 
if __name__ == '__main__': 
    p = Pool(5) 
    print(p.map(f, [1, 2, 3])) 
    print(p.map(f2,[1,2,3])) 

У меня есть случай, когда использование функция й загораживающий (в моем случае это слушает очередь RabbitMQ, поэтому оно должно быть блокированием я использовал длительная временная задержка - 100000000000000, чтобы подразумевать бесконечное блокирование времени). Я смоделировал блокировку с time.delay здесь.

, но мне нужно, чтобы f2 (который отличается от f) запускался и запускался параллельно. В настоящее время он даже не переходит в f2 по мере того, как сам блок блокируется.

Может кто-нибудь, пожалуйста, дайте несколько советов о том, как сделать f и f2 начальным, несмотря на то, что f и f2 блокируют.

Update:

Похоже, я нашел способ, но озадачен

from multiprocessing import Pool 
import time 

def f(x): 
    print(x) 
    time.sleep(100000000000000); 
    return x*x 

def f2(x): 
    print('**' + str(x) + '**') 
    time.sleep(100000000000000); 
    return x*x*x; 

if __name__ == '__main__': 
    p = Pool(5) 
    res = p.apply_async(f, [2]) 
    res = p.apply_async(f2,[4]) 
    res.get() 

как даже после того, как переназначение res1 это работает, и это вызывает даже е?

ответ

0

Ваш подход не работает, поскольку первый пул должен быть завершен, чтобы иметь возможность распечатать результат до второй пул. Таким образом, тип print блокирует запуск второго пула.

Я использовал пул потоков, чтобы одновременно запускать обе оболочки, и получаю результаты асинхронно. Мне пришлось сделать цикл вместо большого sleep, потому что питон жаловался, что сон слишком велик. Но это то же самое. В моем случае имеются распечатки 1,2,3 , , сразу. И если я установил цикл ожидания на разумное значение, я получу некоторые правильные результаты.

from multiprocessing import Pool 
import concurrent.futures 


import time 

sleep_times = 1000000 

def f(x): 
    print(x) 
    for i in range(sleep_times): 
     time.sleep(10) 
    return x*x 

def f2(x): 
    print('**' + str(x) + '**') 
    for i in range(sleep_times): 
     time.sleep(10) 
    return x*x*x; 

def fwrap(l): 
    p = Pool(len(l)) 
    return(p.map(f, l)) 

def fwrap2(l): 
    p = Pool(len(l)) 
    return(p.map(f2, l)) 

if __name__ == '__main__': 
    jr = dict() 
    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: 
     jr[executor.submit(fwrap, (1, 2, 3))] = "f" 
     jr[executor.submit(fwrap2, (1, 2, 3))] = "f2" 

    for future in concurrent.futures.as_completed(jr): 
     ident = jr[future] 
     print(ident,future.result()) 

выход (когда цикл сна снижается до 1, чтобы избежать ожидания слишком долго)

1 
**1** 
2 
**2** 
**3** 
3 

там ждет некоторое время (блокирован от "времени обработки"), то:

('f', [1, 4, 9]) 
('f2', [1, 8, 27]) 
+0

привет, мой код под apply_async, похоже, работает .. я не знаю, как это сделать. может у руководства? –

+0

'apply_async' работает только для 1 значения. Кажется, вы хотите создать список, используя список в качестве входных данных. 'apply_async' не сделает этого. Вам придется перестроить порядок результатов по порядку ввода. –

+0

no Мне хотелось, чтобы и f и f2 запускались, и нельзя было блокировать другое, что происходит правильно? –

Смежные вопросы