繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM