2017-04-26 6 views
0

このコードの主な目的は、毎分ゾンビプロセスの再起動です。 動作しますが、私は__cleanup()を正しく動作させることはできません。 ActivityManager.process_listの値は__cleanup()で、常に[]です。どうすれば修正できますか?共有メモリは解決策ですか?配列が更新された場合、Pythonプロセスがメインスレッドから配列を取得する方法

[2017-04-26 09:56:56,657] INFO Starting init of activity manager 
[2017-04-26 09:56:56,659] INFO Finished init of activity manager 
[2017-04-26 09:56:56,660] INFO Starting cleanup 
[2017-04-26 09:56:56,661] INFO Cleanup was finished 
[] 
[] 
[2017-04-26 09:57:06,671] INFO Starting cleanup 
[2017-04-26 09:57:06,671] INFO Cleanup was finished 
[2017-04-26 09:57:14,465] INFO Add activity process with pid: 29562; list:[<Process(Process-2, started)>] 
[2017-04-26 09:57:16,680] INFO Starting cleanup 
[] 
[2017-04-26 09:57:16,680] INFO Cleanup was finished 

答えて

0

質問:__cleanupでActivityManager.process_list値()は常に[]

コードレビューは

import json 
import os 
import signal 
from multiprocessing import Process 

import psutil 
import time 
from apscheduler.schedulers.blocking import BlockingScheduler 
from django.db.models import Q 

from main import logging 
from main.settings import SOCKETS, SERVER_NUMBER 
from models.models import Activity 

HOST, PORT = SOCKETS[SERVER_NUMBER] 

log = logging.getLogger() 
sched = BlockingScheduler() 


# Add dict(username, process) 
# TODO singleton 
class ActivityManager: 
    process_list = list() 

    def __init__(self): 
     log.info('Starting init of activity manager') 

     p = Process(target=self.__cleanup) 
     p.start() 

     log.info('Finished init of activity manager') 

    def add(self, p): 
     ActivityManager.process_list.append(p) 
     log.info("Add activity process with pid: %d; list:%s" % (p.pid, ActivityManager.process_list)) 

    def kill(self, pid=None, p=None): 
     term_list = list() 

     if p is not None and pid is not None: 
      log.info('You can pass only pid or only process') 
      return 
     elif pid is not None: 
      term_list = (p for p in ActivityManager.process_list if p.pid == pid) 
      log.info('Add process by pid to terminate list pid: %d' % pid) 
     elif p is not None: 
      term_list.append(p) 
      log.info('Add process by process to terminate list pid: %d' % p.pid) 
     else: 
      raise Exception('ACTIVITY PROCESS KILL LIST IS EMPTY !!') 

     for process in term_list: 
      try: 
       os.kill(process.pid, signal.SIGTERM) 
       log.info('Terminate activity process pid: %d' % process.pid) 
      except ProcessLookupError as err: 
       log.exception(err, "No process activity with pid: %d" % process.pid) 
      except Exception as err: 
       log.exception(err, "Unable to terminate activity process pid: %d" % process.pid) 
      finally: 
       ActivityManager.process_list.remove(process) 
       log.info("Activity process was terminated pid: %d" % process.pid) 

    def reboot_zombie(self, process): 
     p = psutil.Process(process.pid) 
     log.info("Searching for zombies in pid: %d" % process.pid) 
     with p.oneshot(): 
      if p.status() == 'zombie': 
       zombie = Activity.objects.filter(Q(pid=p.pid)).order_by('-creation_date').first() 

       if zombie is not None: 
        log.info("Trying to kill zombie pid: %d" % p.pid) 
        self.kill(p=process) 
        self.boot_activity(zombie) 

    @staticmethod 
    def boot_activity(activity): 
     configs = json.loads(activity.configs) 
     print(configs) 

    def __cleanup(self): 
     while True: 
      log.info('Starting cleanup') 
      print(ActivityManager.process_list)   # [] always 
      map(lambda p: self.reboot_zombie(p), ActivityManager.process_list) 
      log.info('Cleanup was finished') 

      time.sleep(10) 

ログインが望ましいです。どうすれば修正できますか?

あなたは、プロセス間通信チャネルを使用することができます。

のPython»ドキュメント: キューおよびパイプ:Exchanging objects between processes
マルチプロセッシングは、プロセス間の通信チャネルの2種類をサポートしています。

関連する問題