Python OS X如何在多个终端窗口中并行启动脚本

2024-05-17 18:03:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行一个数据挖掘项目,我想从多个站点同时获取信息。我目前正在通过在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}$

Tags: 方法runpyimportself目的脚本终端
3条回答

一种简单的方法是在后台运行脚本,这实际上非常简单。只需在调用的末尾添加一个&(将命令发送到后台),就可以在同一个终端中运行它们:

python trigger.py [params] &

您甚至可以编译一个bash脚本,用一个命令同时启动所有这些脚本。您还可以使用此方法将返回值聚合到一个位置,以便于使用:

矿工.sh

^{pr2}$

要在多个进程中执行并行执行,请查看multiprocessing模块。在

下面的代码是一个简单的示例,它为数组中的每个url启动一个进程。在实践中(如果url的数量任意大),您可能希望使用Pool,这样就可以将url排队到固定数量的进程中。在

from multiprocessing import Process

def worker_process(url):
    # process url...
    print 'processing %s' % url

def main():
    urls = ['http://www1.example.com/', 'http://www2.example.com/']
    workers = []
    for i in range(0, len(urls)):
        p = Process(target=worker_process, args=(urls[i],))
        p.start()
        workers.append(p)

    for worker in workers:
        worker.join()

if __name__ == '__main__':
    main()

不是独立的终端会话,而是允许并行运行的独立进程/线程。您可以按照@asdf在同一个shell后台运行它们。
如果查看threading模块,甚至可以在同一进程中运行它们。在

但是,如果它们产生输出(例如诊断/进度消息),它们将相互重叠输出。在这种情况下,您可以使用screen在虚拟终端会话中启动多个进程,但具有独立的输入和输出:

os.system('screen -dm scrape /Users/InNov8/Desktop/execute.py ' + str(self.number))

-dm表示以分离状态启动。然后,您可以从任何终端窗口附加到此屏幕:

^{pr2}$

您可以使用<Crtl-a>n<Ctrl-a>p在不同的运行进程之间移动,并使用<Ctrl-a>d分离

相关问题 更多 >