Когда я использую 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 строки текста в выходной файл. Что здесь происходит?