如何在多处理运行时检查值是否匹配



我想做的是检查值"检查器";周期性地,但不会像defscraper那样得到相同的值,即使我使用global。我需要这个来做一个应急,如果检查器与代码不匹配,则重新启动该过程。

from logging import WARN
from multiprocessing import Process
import time
import multiprocessing
checker = 0
def warn():
#DO STUFF 

def changing():
global checker
while True:
#STUFFS
time.sleep(1)
checker += 1
print('Value:', checker)

def proc_start():
p_to_start = Process(target=changing)
p_to_start.start()
return p_to_start

def proc_stop(p_to_stop):
p_to_stop.terminate()

if __name__ == '__main__':
p = proc_start()
while True:
time.sleep(20)
if checker > 10:
checker = 0
else:   
warn()
print('-----------------------RESTARTING-----------------------------------')
proc_stop(p)
p = proc_start()

问题是,您的子进程和主进程看到不同版本的变量checker,每个变量都存在于其自身的地址空间中,对于正在运行的进程是唯一的。

为了使其工作,checker需要像在共享内存中一样创建。在下面的代码中,创建了一个带有锁的multiprocessing.Value实例,在该锁下,将对公共checker值进行修改,以便每个进程看到一致的值。我还建议您熟悉Python的PEP8样式指南。你不想在生活中使用一个空格来缩进新的代码块。

from logging import WARN
from multiprocessing import Process
import time
import multiprocessing
def warn():
#DO STUFF
...
def changing(checker):
while True:
#STUFFS
time.sleep(1)
with checker.get_lock():
checker.value += 1
print('Value:', checker.value)
def proc_start(checker):
p_to_start = Process(target=changing, args=(checker,))
p_to_start.start()
return p_to_start
def proc_stop(p_to_stop):
p_to_stop.terminate()
if __name__ == '__main__':
# Create shared unsigned long:
checker = multiprocessing.Value('L', 0, lock=True)
p = proc_start(checker)
while True:
time.sleep(20)
with checker.get_lock():
if checker.value > 10:
checker.value = 0
else:
warn()
print('-----------------------RESTARTING-----------------------------------')
proc_stop(p)
# Should checker be reset back to 0?
#checker.value = 0
p = proc_start(checker)

打印:

Value: 1
Value: 2
Value: 3
Value: 4
Value: 5
Value: 6
Value: 7
Value: 8
Value: 9
Value: 10
Value: 11
Value: 12
Value: 13
Value: 14
Value: 15
Value: 16
Value: 17
Value: 18
Value: 19
Value: 1
Value: 2
Value: 3
Value: 4
Value: 5
Value: 6
Value: 7
Value: 8
Value: 9
etc.

相关内容

  • 没有找到相关文章

最新更新