如何将变量传递给pool.map运行的所有进程?

时间:2019-02-20 22:25:40

标签: python-3.x

我是Python3的新手,并且开始涉足多处理。我已经搜索了有关我的问题的答案,并看到了look at its constructor,但不确定是否对我有用。

我的项目由几个.py文件组成。每个人都连接到一台设备并收集统计信息,构建HTML表,并使用最新数据更新我的网站。为了启动/控制这些过程,我有一个文件main.py处理多重处理:

from multiprocessing import Pool
import os
import time

processes = ('1.py', '2.py', '3.py', '4.py')

def run_process(process):
    os.system('sudo python3 {}'.format(process)) 

pool = Pool(processes=4)

while True:
    pool.map(run_process, processes)
    time.sleep(60)

注意:我正在使用sudo,以便python可以从root拥有的文件中读取密码,该文件用于每个进程中的SSH连接。还要注意:我的每个“进程”文件(即1.py)都可以独立于main.py运行,而绝不需要与main.py或其他任何通信程序。

我的问题是:如何将变量传递给每个进程?我希望每个进程知道它已经运行了多少次,因此我可以每X次运行一次特定功能。

我不知道如何实现这一目标,这实际上是自大约4个月前我开始学习Python以来的第一次。由于我执行它们的方式,我不能简单地在每个#.py文件中放置一个计数器(例如,它们运行,并且它们在完成时完全终止-换句话说,从#.py,它每次运行时都是第一次运行)。以下代码可能不是有效的python代码,但我想它看起来像这样(以说明我想做的事情):

from multiprocessing import Pool
import os
import time

processes = ('1.py', '2.py', '3.py', '4.py')

def run_process(process):
    os.system('sudo python3 {}'.format(process)) 

pool = Pool(processes=4)
run_counter = 0
while True:
    pool.map(run_process, processes, run_counter)
    time.sleep(60)
    run_counter += 1

例如,为了进一步说明我的观点,1.py将接受run_counter变量并具有一些逻辑说“如果这是我第一次运行,请执行foo();否则,请跳过它” -如果这是我正在运行的第10/20/30 / etc时间,请执行foo()。这样做是为了进一步优化我的程序,因为它正在做很多不必要的工作,而这些工作并不是每次迭代都绝对必要的。

谢谢!

更新1:

我一直在尝试传递一个全局变量以尝试使其正常工作,但是这种可能的解决方案遇到了问题。我的代码示例:

from multiprocessing import Pool
import os
import time

processes = ('1.py', '2.py', '3.py', '4.py')
run_counter = 1

def run_process(process):
    global run_counter
    os.system('sudo python3 {0} {1}'.format(process, run_counter))

pool = Pool(processes=4)

while True:
    pool.map(run_process, processes)
    time.sleep(60)
    run_counter += 1
    print("Updating run counter to {}".format(run_counter))

在我的文件1.py中,我有以下内容:

import sys
run_counter = sys.argv[1]
print("Run counter from 1.py is {}".format(run_counter))

执行main.py时,我看到以下内容:

Run counter from 1.py is 1 Updating run counter to 2 Run counter from 1.py is 1 Updating run counter to 3 Run counter from 1.py is 1

我知道更改全局变量需要在更改前先使用global myVar语句,而且我也尝试过-两种方式都会产生相同的输出。

0 个答案:

没有答案