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

2024-04-19 18:27:48 发布

您现在位置:Python中文网/ 问答频道 /正文

这段代码的主要目的是每*分钟重新启动一次僵尸进程 它工作,但我不能使我的__cleanup()正常工作。^__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: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

Tags: fromimportselfinfononelogdefactivity
1条回答
网友
1楼 · 发布于 2024-04-19 18:27:48

Question: ActivityManager.process_list value in __cleanup() always []. How can I fix it?

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

Python » Documentation: Exchanging objects between processes
multiprocessing supports two types of communication channel between processes: Queues and Pipes.

相关问题 更多 >