Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果数组被刷新,如何使python进程从主线程获取数组_Python_Arrays_Python 3.x_Multiprocessing_Shared Memory - Fatal编程技术网

如果数组被刷新,如何使python进程从主线程获取数组

如果数组被刷新,如何使python进程从主线程获取数组,python,arrays,python-3.x,multiprocessing,shared-memory,Python,Arrays,Python 3.x,Multiprocessing,Shared Memory,这段代码的主要目的是每*分钟重新启动一次僵尸进程 它可以工作,但我无法使我的\u cleanup()正常工作活动管理器。处理\uu cleanup()中的值,始终[]。我怎样才能修好它?共享内存可以是解决方案吗 代码审查是可取的 import json import os import signal from multiprocessing import Process import psutil import time from apscheduler.schedulers.blocking

这段代码的主要目的是每*分钟重新启动一次僵尸进程 它可以工作,但我无法使我的
\u cleanup()
正常工作<代码>活动管理器。处理
\uu cleanup()
中的值,始终
[]
。我怎样才能修好它?共享内存可以是解决方案吗

代码审查是可取的

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)
日志:

[2017-04-26 09:56:56657]活动管理器的信息开始初始化
[2017-04-26 09:56:56659]活动经理信息初始化完成
[2017-04-26 09:56:56660]信息开始清理
[2017-04-26 09:56:56661]信息清理已完成
[]
[]
[2017-04-2609:57:06671]信息开始清理
[2017-04-26 09:57:06671]信息清理已完成
[2017-04-26 09:57:14465]信息添加活动流程,pid:29562;名单:[]
[2017-04-26 09:57:16680]信息开始清理
[]
[2017-04-26 09:57:16680]信息清理已完成
问题:ActivityManager.process\u清除()中的列表值始终[]。我怎样才能修好它

您可以使用进程之间的通信通道:

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