多处理从不执行函数在函数之前不断重复代码



>我有一个多处理池,它用 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函数中调用(。

相关内容

  • 没有找到相关文章