>我有一个多处理池,它用 1 个线程运行,它在我的函数之前不断重复代码,我尝试过不同的线程,而且,我做了很多这样的事情,所以我想我知道是什么导致了问题,但我不明白为什么,通常我使用 argparse 来解析来自用户的文件, 但我反而想使用输入,没有抛出任何错误,所以老实说我不知道。
from colorama import Fore
import colorama
import os
import ctypes
import multiprocessing
from multiprocessing import Pool
import random
colorama.init(autoreset=False)
print("headerhere")
#as you can see i used input instead of argparse
g = open(input(Fore.RED + " File Path?: " + Fore.RESET))
gg = open(input(Fore.RED + "File Path?: " + Fore.RESET))
#I messed around with this to see if it was the problem, ultimately disabling it until i fixed it, i just use 1 thread
threads = int(input(Fore.RED + "Amount of Threads?: " + Fore.RESET))
arrange = [lines.replace("n", "")for lines in g]
good = [items.replace("n", "") for items in gg]
#this is all of the code before the function that Pool calls
def che(line):
print("f")
#i would show my code but as i said this isnt the problem since ive made programs like this before, the only thing i changed is how i take file inputs from the user
def main():
pool = Pool(1)
pool.daemon = True
result = pool.map(che, arrange)
if __name__ == "__main__":
main()
if __name__ == "__main__":
main()
下面是一个最小的、可重现的问题示例:
from multiprocessing import Pool
print('header')
def func(n):
print(f'func {n}')
def main():
pool = Pool(3)
pool.map(func,[1,2,3])
if __name__ == '__main__':
main()
在"spawn"(Windows和MacOS(或"forkserver"(一些Unix(是默认启动方法的操作系统上,子进程会导入您的脚本。 由于print('header')
在全局范围内,它将在脚本首次导入进程时运行,因此输出为:
header
header
header
header
func 1
func 2
func 3
多处理脚本应该具有在函数内部运行一次的所有内容,并且主脚本应该通过if_name__ == '__main__':
调用它们一次,因此解决方案是将其移动到您的def main():
中:
from multiprocessing import Pool
def func(n):
print(f'func {n}')
def main():
print('header')
pool = Pool(3)
pool.map(func,[1,2,3])
if __name__ == '__main__':
main()
输出:
header
func 1
func 2
func 3
如果您希望定义che
之前的顶级代码仅在主进程中执行,则将其放在函数中并在main
中调用该函数。
在多处理中,顶级语句将由主进程和每个子进程解释/执行。 因此,如果某些代码只能由主节点而不是子代码执行,那么此类代码不应将其放在顶层。 相反,这样的代码应该放在函数中,这些函数应该在主作用域中调用,即在由__main__
控制的if
块的范围内(或在代码片段的main
函数中调用(。