我的主Python脚本导入了2个其他脚本; Test1.py和Test2.py。
Test1.py执行多处理,Test2.py执行简单的os.system(' ls')命令。当Test1.py完成并调用Test.py时,os.system(ls)变得疯狂并创建无限的新进程。有谁知道为什么会这样?
# Main
import multiprocessing
import Test1.py
import Test2.py
def doSomething():
# Function 1, file1...file10 contain [name, path]
data = [file1, file2, file3, file4, file5, file6, file7, file8, file9, file10]
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=min(len(data), 5))
print pool.map(Test1.worker, data)
# Function 2
Test2.worker()
Test1.py;调用perl命令
def worker(data):
command = 'perl '+data[1].split('data_')[0]+'methods_FastQC\\fastqc '+data[1]+'\\'+data[0]+'\\'+data[0]+' --outdir='+data[1]+'\\_IlluminaResults\\_fastqcAnalysis'
process = subprocess.Popen(command, stdout=subprocess.PIPE)
process.wait()
process.stdout.read()
Test2.py应该执行一个简单的ls命令,而不是停止发出新命令;
def worker():
command = 'ls'
os.system(command)
当查看脚本启动时的进程时,似乎function1之后的进程也没有正确关闭。通过Taskmanager,我仍然看到5个额外的pythonw.exe似乎什么也没做。只有当我关闭打开的外壳时,它们才会消失。这可能与os.system(命令)在函数2中疯狂的原因有关?有没有人有解决方案,因为我无法关闭shell,因为脚本还没有完成,因为它仍然需要执行function2?
编辑:当试图找到解决方案时,也发生了function1从多次执行函数(2)的命令开始,之后是perl命令。这更奇怪。
答案 0 :(得分:0)
每次导入主模块时都会执行doSomething()
,并且在工作人员初始化期间可以multiprocessing
多次导入它。您可以通过print(os.getpid())
中的打印流程pid Test2.worker()
进行检查。
您应该在模块级别使用if __name__ == '__main__':
。在代码显示的函数内部执行此操作非常容易出错。
import multiprocessing
# ...
if __name__ == '__main__': # at global level
multiprocessing.freeze_support()
main() # it calls do_something() and everything else
请参阅the introduction to multiprocessing
中的第一个注释。