[英]How i can check if a value matches while multiprocessing is running
我想要做的是定期检查值“检查器”,但不要像 def scraper 那样获得相同的值,即使我使用全局。 我需要这个来进行应急,如果检查器与代码不匹配,则重新启动该过程。
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
值进行修改,以便每个进程看到一致的值。 我还建议您熟悉PEP8 Style Guide for Python 。 您不会希望使用单个空格来缩进新的代码块。
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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.