是否有一种方法可以编写一个python脚本来模拟GNU Screen和Bash的使用?我最初试图写一个简单的Bash脚本,但我怀疑学习multiprocessing
模块会给我一点灵活性,更不用说python模块有很好的文档。
所以,我在教程和文档中看到了并行运行单个函数的使用,但是我对如何使用它有点迷路。任何参考资料都会非常有帮助。
下面就是我想要的:如果我在不同的python文件中有一堆实验,那么在Bash中:
$python experiment1.py&
$python experiment2.py& ...
在Python中,如果我在同一个脚本中有一堆函数,则main会模拟上面的(?这只是一个猜测,我无意冒犯别人(我的无知除外):
import multiprocessing as mp
def experiment1():
"""run collection of simulations and collect relevant statistics"""
....
def experiment2():
"""run different collection of simulations and collect relevant statistics"""
....
if __name__ == '__main__':
one = mp.process(target = experiment1)
two = mp.process(target = experiment2)
...
one.start()
two.start()
...
one.join()
two.join()
我不确定我将如何测试这个,除了可能我的OSX上的活动监视器,这似乎没有告诉我内核的分布,所以建议检查python没有运行时将是有帮助的。最后一个问题可能太笼统了,但我还是想把它插进去。谢谢你的帮助!
下面的程序并行运行一堆脚本。对于每个任务,它在开始和结束时打印一条消息。如果它以错误退出,则打印错误代码和命令行,并继续执行程序。
每次在系统的每个CPU上运行一个shell脚本。
import multiprocessing as mp, subprocess
def run_script(script_name):
curproc = mp.current_process()
cmd = ['python', script_name]
print curproc, 'start:', cmd
try:
return subprocess.check_output(
cmd, shell=False)
except subprocess.CalledProcessError as err:
print '{} error: {}'.format(
curproc, dict(
status=err.returncode,
command=cmd,
)
)
finally:
print curproc, "done"
scripts = ['zhello.py', 'blam']
pool = mp.Pool() # default: num of CPUs
print pool.map(
run_script, scripts,
)
pool.close()
pool.join()
输出python: can't open file 'blam': [Errno 2] No such file or directory
<Process(PoolWorker-2, started daemon)> start: ['python', 'blam']
<Process(PoolWorker-2, started daemon)> error: {'status': 2, 'command': ['python', 'blam']}
<Process(PoolWorker-2, started daemon)> done
<Process(PoolWorker-1, started daemon)> start: ['python', 'zhello.py']
<Process(PoolWorker-1, started daemon)> done
['howdyn', None]
import multiprocessing as mp, subprocess
def run_script(script_name):
curproc = mp.current_process()
cmd = ['python', script_name]
print curproc, 'start:', cmd
try:
return subprocess.check_output(
cmd, shell=False)
except subprocess.CalledProcessError as err:
print '{} error: {}'.format(
curproc, dict(
status=err.returncode,
command=cmd,
)
)
finally:
print curproc, "done"
scripts = ['zhello.py', 'blam']
pool = mp.Pool() # default: num of CPUs
print pool.map(
run_script, scripts,
)
pool.close()
pool.join()
python: can't open file 'blam': [Errno 2] No such file or directory
<Process(PoolWorker-2, started daemon)> start: ['python', 'blam']
<Process(PoolWorker-2, started daemon)> error: {'status': 2, 'command': ['python', 'blam']}
<Process(PoolWorker-2, started daemon)> done
<Process(PoolWorker-1, started daemon)> start: ['python', 'zhello.py']
<Process(PoolWorker-1, started daemon)> done
['howdyn', None]