【发布时间】:2014-03-23 06:22:17
【问题描述】:
注意:我想在不使用任何框架的情况下实现它。
我必须使用 python 创建一个 Web 应用程序。应用程序应保持过去 60 秒内每个进程的 CPU 使用率的运行平均值。它应该充当 Web 服务器,当它收到请求时,它应该返回每个进程的当前平均值。以下是我编写的脚本。 record_usage.py 是我想在 server.py 运行后立即运行的脚本。这样它就可以运行并维护 cpu 使用数据,我打算在收到 XHR 请求并将其发送回客户端时读取这些数据。
那么,我的问题是如何调用此要求?我尝试在启动服务器后使用 subprocess.POPEN 运行 record_usage.py。 record_usage.py 也开始在后台运行。但是当我尝试访问它创建的数据时,我创建的类对象不是它使用的对象,而是一个新对象。如何完成此链接?
请询问我无法说清楚的事情。
server.py 的最新变化
if __name__ == '__main__':
RU_OBJ = RU(settings.SAMPLING_FREQ, settings.AVG_INTERVAL)
RU_LOCK = RLock()
# Record CPU usage in a thread.
ru_thread = Thread(target=RU_OBJ.record, args=(RU_LOCK,))
ru_thread.daemon = True
ru_thread.start()
# Run server.
run()
record_usage.py 的最新变化
def record(self, lock):
while True:
with lock:
self.add_processes()
time.sleep(self.sampling_freq)
这是应用锁的正确方法吗?读取进程信息时应用了类似的锁。行得通吗?
新增功能:
def add_processes(self,):
for _process in psutil.process_iter():
try:
new_proc = _process.as_dict(attrs=['cpu_times', 'name', 'pid',
'status'])
except psutil.NoSuchProcess:
continue
pid, (user, _sys) = new_proc['pid'], new_proc.pop('cpu_times')
# Get or create details object for the process.
existing = self.processes.setdefault(pid, new_proc)
# Get or create queue object for the CPU times of the process.
queue_dict = self.process_queue.setdefault(pid, dict())
# User CPU time.
user_q = queue_dict.setdefault('user_q', PekableQueue(self.avg_interval))
user_q.enqueue(user)
user_avg = get_avg(user_q)
# System CPU time.
sys_q = queue_dict.setdefault('sys_q', PekableQueue(self.avg_interval))
sys_q.enqueue(_sys)
sys_avg = get_avg(sys_q)
# Update the details object for the process.
existing.update(user_avg=user_avg, sys_avg=sys_avg, **new_proc)
def get_curr_processes(self):
return [self.processes[pid] for pid in psutil.get_pid_list()
if pid in self.processes]
【问题讨论】:
-
不清楚“这个要求”指的是什么。最简单的解决方案是在不同的线程而不是不同的进程中收集统计信息
-
@JFSebastian 这个要求是将统计信息传送到服务器。你能用一个小例子来使用线程吗?
-
你为什么认为你需要一个锁?
-
因为字典在阅读时可能会被修改。因此,差异过程的数据可能在它们产生的时间方面存在不一致。我想错了吗?
-
什么字典?锁保护的代码越少越好(在字典附近使用它,不要包装整个方法)。除非在至少两个线程中使用,否则锁是无用的。你不需要
RLock,除非你需要递归获取它
标签: python web-applications process subprocess