我是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()。这样做是为了进一步优化我的程序,因为它正在做很多不必要的工作,而这些工作并不是每次迭代都绝对必要的。
谢谢!
我一直在尝试传递一个全局变量以尝试使其正常工作,但是这种可能的解决方案遇到了问题。我的代码示例:
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
语句,而且我也尝试过-两种方式都会产生相同的输出。