我如何在多处理运行时检查值是不是匹配
Posted
技术标签:
【中文标题】我如何在多处理运行时检查值是不是匹配【英文标题】:How i can check if a value matches while multiprocessing is running我如何在多处理运行时检查值是否匹配 【发布时间】:2021-12-20 21:16:47 【问题描述】:我想要做的是定期检查值“检查器”,但不会像 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()
【问题讨论】:
【参考方案1】:问题在于您的子进程和主进程看到变量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.
【讨论】:
以上是关于我如何在多处理运行时检查值是不是匹配的主要内容,如果未能解决你的问题,请参考以下文章
Oracle - 如何检查多条记录中的值以及一个值是不是匹配 - 将其用于更大的数据集
如何在多实例应用程序上处理 TransactionScope?