2016-05-10 4 views
0

Я новичок в многопроцессе python, и я хочу понять, почему мой код не заканчивается (возможно, зомби или тупик) и как его исправить. Функции createChain также выполняют цикл for и возвращают кортеж: (value1, value2). Внутри функции createChain есть другие вызовы для других функций. Я не думаю, что размещение кода функции createChain поможет, потому что внутри этой функции я ничего не делаю в отношении многопроцессорности. Я пытался сделать процессы как деамон, но все равно не работал. Странно думать, что если я уменьшу значение maxChains i.e до 500 или 100 работает.Python Multiprocess не заканчивается

Я просто хочу, чтобы процесс выполнял тяжелые задачи и помещал результаты в тип данных.

Моя версия питона 2,7

def createTable(chainsPerCore, q, chainLength): 

    for chain in xrange(chainsPerCore): 
     q.put(createChain(chainLength, chain)) 


def initTable(): 
    maxChains = 1000 
    chainLength = 10000 
    resultsQueue = JoinableQueue() 
    numOfCores = cpu_count() 
    chainsPerCore = maxChains/numOfCores 

    processes = [Process(target=createTable, args=(chainsPerCore, resultsQueue, chainLength,)) for x in range(numOfCores)] 

    for p in processes: 
     # p.daemon = True 
     p.start() 

    # Wait for hashing cores to finish 
    for p in processes: 
     p.join() 

    resultsQueue.task_done() 

    temp = [resultsQueue.get() for p in processes] 
    print temp 
+0

Возможно ли он просто занимает очень много времени? есть ли какой-либо способ получить какой-то сигнал о том, как далеко продвинулась обработка, пока она работает? –

+0

Это не займет много времени. Если я запускаю его без многопроцессорного завершения, он заканчивается через 1 минуту. Кроме того, когда я использую multiprocess, я контролирую CPU, и я вижу, что ядра запущены, и через пару секунд они останавливаются, поэтому работа прекратилась, но программа не завершается. Благодаря! – Laxmana

+0

В этом случае я бы рекомендовал добавлять инструкции 'print' между каждым из шагов (' p.start() 'loop,' p.join() 'loop,' resultsQueue.task_done() ', а затем' temp = ..') и посмотреть, на какой из них он замерзает. –

ответ

0

Основываясь на очень полезные комментарии Tadhg Макдональд-Jensen я понял, лучше мои потребности и как Очереди разработки и для какой цели они должны быть использованы.

я изменить свой код

def initTable(output): 
    maxChains = 1000 

    results = [] 

    with closing(Pool(processes=8)) as pool: 
     results = pool.map(createChain, xrange(maxChains)) 
     pool.terminate()