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

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?

如何检查选择器是不是匹配 jQuery 中的某些内容? [复制]

如何检查所有代码路径是不是返回值

如何在多处理函数中传递参数以及如何使用多处理列表?