Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何将变量传递给pool.map运行的所有进程?_Python 3.x - Fatal编程技术网

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

Python 3.x 如何将变量传递给pool.map运行的所有进程?,python-3.x,Python 3.x,我是Python3的新手,现在开始涉足多处理。我已经找到了关于我的问题的答案,也看到了答案,但我不确定它是否适合我 我的项目由几个.py文件组成。每个人都连接到一个设备,收集统计数据,构建一个HTML表,并用最新数据更新我的网站。为了启动/控制这些进程,我有一个处理多进程的文件main.py: from multiprocessing import Pool import os import time processes = ('1.py', '2.py', '3.py', '4.py')

我是Python3的新手,现在开始涉足多处理。我已经找到了关于我的问题的答案,也看到了答案,但我不确定它是否适合我

我的项目由几个
.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代码,但我想它应该是这样的(为了说明我想做什么):

例如,为了进一步说明我的观点,
1.py
将接受run\u计数器变量,并具有一些逻辑,表示“如果这是我第一次运行,请执行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时,我看到以下内容:

import sys
run_counter = sys.argv[1]
print("Run counter from 1.py is {}".format(run_counter))
从1.py开始的运行计数器为1
正在将运行计数器更新为2
从1.py开始的运行计数器为1
正在将运行计数器更新为3
从1.py开始的运行计数器为1


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

我没有尝试过,因为我假设主机上的每个python3进程之间都无法访问全局变量。我的意思是,我用
sudo python3 main.py
启动main.py,然后main.py用
sudo python3 1.py
启动每个#.py文件,所以实际上在我的主机上有5个python进程同时运行。老实说,我还没有在Python中使用全局变量,但我对它们的理解是,它们用于在同一进程内共享函数的内部/外部。我确实明白您所说的Carcigenicate,但我不确定是否可以在调用时传递变量,如:
os.system('sudo python3{0}{1}'。format(process,run_counter))
。我不知道这是否是有效的python,也不知道如何“接受”python文件本身中的变量。编辑:。我没有尝试这样做,因为我假设主机上的每个python3进程之间都无法访问全局变量。我的意思是,我用
sudo python3 main.py
启动main.py,然后main.py用
sudo python3 1.py
启动每个#.py文件,所以实际上在我的主机上有5个python进程同时运行。老实说,我还没有在Python中使用全局变量,但我对它们的理解是,它们用于在同一进程内共享函数的内部/外部。我确实明白您所说的Carcigenicate,但我不确定是否可以在调用时传递变量,如:
os.system('sudo python3{0}{1}'。format(process,run_counter))
。我不知道这是否是有效的python,也不知道如何“接受”python文件本身中的变量。编辑:。