如果刷新数组,如何使 python 进程从主线程获取数组
How to make python process get array from main thread, if array was refreshed
此代码的主要目的是每 * 分钟重新启动僵尸进程
它有效,但我无法让我的 __cleanup()
正常工作。 ActivityManager.process_list
__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
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.
此代码的主要目的是每 * 分钟重新启动僵尸进程
它有效,但我无法让我的 __cleanup()
正常工作。 ActivityManager.process_list
__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
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.