我正在进行一个数据挖掘项目,我想从多个站点同时获取信息。我目前正在通过在20个不同的终端窗口(在OSX上)运行相同的挖掘脚本来实现这一点。在
我认为(这可能是不正确的)在不同的终端窗口中运行脚本是并行执行挖掘的原因。在
问题:
A)如果我不正确地使用多个终端窗口,最佳方法是什么?在
B)如果我使用多个终端窗口是正确的,有没有一种有效的方法让脚本在20个不同的终端窗口中执行?在
我用两个脚本建立了一个原型。在
脚本1是触发器.py它的目的是向第二个脚本发送一个参数列表。在下面的触发器脚本中,我使用的是数字,但我的想法是发送url。在
脚本2是执行.py它的目的是接收参数并执行,理想情况下每个参数在一个新的终端窗口中执行。实际上,如果这种方法是最好的方法,那么我将miner放在这个脚本中,让它接收url,打开一个新的终端窗口,然后运行。在
现在它只是在同一个窗口中执行。这也是我寻求帮助的问题。在
在
脚本1触发器.py在
#!/usr/bin/python
import os
import sys
class newTerm(object):
def __init__(self, number):
self.number = number
def run(self):
os.system('/Users/InNov8/Desktop/execute.py ' + str(self.number))
starts = [100, 500, 1000, 2000]
for s in starts:
new = newTerm(s)
new.run()
脚本2执行.py在
^{pr2}$
一种简单的方法是在后台运行脚本,这实际上非常简单。只需在调用的末尾添加一个
&
(将命令发送到后台),就可以在同一个终端中运行它们:您甚至可以编译一个bash脚本,用一个命令同时启动所有这些脚本。您还可以使用此方法将返回值聚合到一个位置,以便于使用:
矿工.sh
^{pr2}$要在多个进程中执行并行执行,请查看multiprocessing模块。在
下面的代码是一个简单的示例,它为数组中的每个url启动一个进程。在实践中(如果url的数量任意大),您可能希望使用Pool,这样就可以将url排队到固定数量的进程中。在
不是独立的终端会话,而是允许并行运行的独立进程/线程。您可以按照@asdf在同一个shell后台运行它们。
如果查看
threading
模块,甚至可以在同一进程中运行它们。在但是,如果它们产生输出(例如诊断/进度消息),它们将相互重叠输出。在这种情况下,您可以使用
screen
在虚拟终端会话中启动多个进程,但具有独立的输入和输出:
^{pr2}$-dm
表示以分离状态启动。然后,您可以从任何终端窗口附加到此屏幕:您可以使用
<Crtl-a>n
和<Ctrl-a>p
在不同的运行进程之间移动,并使用<Ctrl-a>d
分离相关问题 更多 >
编程相关推荐