многопроцессорность дает неверное количество выходов, повторяется за пределами области видимости - PullRequest
1 голос
/ 30 марта 2020

Когда я использую multiprocessing.pool.starmap, он повторяет процесс вне части, которую я определяю как процесс. Я не понимаю, почему.

MRA:

from multiprocessing import Pool

def countAdd( first, second, third ): 
    added = str( first + second + third ) 
    with open( "test.txt", 'a' ) as f: 
        f.write( "this is string: " + added + '\n')

testlist = [ 1, 2, 3, 4, 5, 6, ]

testlist2 = [  7, 8, 9, 10, 11, 12 ]

testlist3 = [ 13, 14, 15, 16, 17, 18  ]

arglist = [ (testlist[ test ], testlist2[ test ], testlist3[ test ]) for test in range( 0, len( testlist ) )  ]

print( arglist )
print( len( testlist ) )

if __name__ == '__main__': 
    with Pool( 3 ) as pool: 
        pool.starmap( countAdd, arglist ) 

Вывод:

[(1, 7, 13), (2, 8, 14), (3, 9, 15), (4, 10, 16), (5, 11, 17), (6, 12, 18)]
6
[(1, 7, 13), (2, 8, 14), (3, 9, 15), (4, 10, 16), (5, 11, 17), (6, 12, 18)]
6
[(1, 7, 13), (2, 8, 14), (3, 9, 15), (4, 10, 16), (5, 11, 17), (6, 12, 18)]
6
[(1, 7, 13), (2, 8, 14), (3, 9, 15), (4, 10, 16), (5, 11, 17), (6, 12, 18)]
6

file:

this is string: 21
this is string: 24
this is string: 27
this is string: 33
this is string: 36

Так что я действительно запутался. Почему печатные заявления также печатаются неоднократно? Но только в 4 раза ?! Почему файл содержит только 5 раз выход функции, а не 6 раз, даже если arglist содержит 6 кортежей?

Я искал вокруг, нашел похожую проблему, но не так. Python Неправильный вывод многопроцессорных данных

Спасибо, что нашли время ответить.

РЕДАКТИРОВАТЬ: Основываясь на комментариях MisterMiyagi, я изменил свой код на следующий, но Есть еще проблемы:

from multiprocessing import Pool


def countAdd( first, second, third ): 
    added = str( first + second + third ) 
    with open( "test.txt", 'a' ) as f: 
        f.write( "this is string: " + added + '\n')

if __name__ == '__main__':  

    testlist = [ 1, 2, 3, 4, 5, 6, ]

    testlist2 = [  7, 8, 9, 10, 11, 12 ]

    testlist3 = [ 13, 14, 15, 16, 17, 18  ]

    arglist = [ (testlist[ test ], testlist2[ test ], testlist3[ test ]) for test in range( 0, len( testlist ) )  ]

    print( arglist )
    print( len( arglist ) )

    with Pool( 3 ) as pool: 
        pool.starmap( countAdd, arglist )


    print( "done")

Я неоднократно запускал код. Иногда я получаю шесть строк вывода, а иногда нет. Я выполнил код 10 раз, и я получил 54 строки текста в выходной файл. Что здесь происходит?

...