簡體   English   中英

在python的守護進程線程中運行對象方法

[英]Run an object method in a daemon thread in python

我試圖用vms模擬環境,並試圖在后台線程中運行對象方法。 我的代碼如下所示。

hyper_v.py文件:

import random
from threading import Thread
from virtual_machine import VirtualMachine

class HyperV(object):
def __init__(self, hyperv_name):
    self.hyperv_name = hyperv_name
    self.vms_created = {}

def create_vm(self, vm_name):
    if vm_name not in self.vms_created:
        vm1 = VirtualMachine({'vm_name': vm_name})
        self.vms_created[vm_name] = vm1
        vm1.boot()
    else:
        print('VM:', vm_name, 'already exists')

def get_vm_stats(self, vm_name):
    print('vm stats of ', vm_name)
    print(self.vms_created[vm_name].get_values())

if __name__ == '__main__':
    hv = HyperV('temp')
    vm_name = 'test-vm'
    hv.create_vm(vm_name)
    print('getting vm stats')
    th2 = Thread(name='vm1_stats', target=hv.get_vm_stats(vm_name) )
    th2.start()

同一目錄中的virtual_machine.py文件:

import random, time, uuid, json 
from threading import Thread

class VirtualMachine(object):
def __init__(self, interval = 2, *args, **kwargs):
    self.vm_id = str(uuid.uuid4())
    #self.vm_name = kwargs['vm_name']
    self.cpu_percentage = 0
    self.ram_percentage = 0
    self.disk_percentage = 0
    self.interval = interval

def boot(self):
    print('Bootingup', self.vm_id)
    th = Thread(name='vm1', target=self.update() )
    th.daemon = True      #Setting the thread as daemon thread to run in background
    print(th.isDaemon())  #This prints true 
    th.start()

def update(self):
    # This method needs to run in the background simulating an actual vm with changing values. 
    i = 0 
    while(i < 5 ): #Added counter for debugging, ideally this would be while(True) 
        i+=1 
        time.sleep(self.interval)
        print('updating', self.vm_id)
        self.cpu_percentage = round(random.uniform(0,100),2)
        self.ram_percentage = round(random.uniform(0,100),2)
        self.disk_percentage = round(random.uniform(0,100),2)

def get_values(self):
    return_json = {'cpu_percentage': self.cpu_percentage,
                   'ram_percentage': self.ram_percentage,
                   'disk_percentage': self.disk_percentage}
    return json.dumps(return_json)

這個想法是創建一個線程,該線程會不斷更新值並根據請求,我們通過調用vm_obj.get_values()讀取vm對象的值,我們將創建多個vm_objects來模擬並行運行的多個vm,我們需要根據要求從特定虛擬機獲取信息。

我面臨的問題是,vm的update()函數無法在后台運行(即使該線程被設置為守護程序線程)。

方法調用hv.get_vm_stats(vm_name)等待直到完成vm_object.update() (由vm_object.boot()調用),然后打印統計信息。 我想通過保持vm_object.update()永遠在后台運行來獲取請求時vm的統計信息。

如果我忽略了與基礎知識相關的任何內容,請分享您的想法。 我試圖調查與python線程庫相關的問題,但無法得出任何結論。 任何幫助是極大的贊賞。 下一步將是使用REST api來調用這些函數以獲取任何vm的數據,但我對這個問題感到震驚。

提前致謝,

正如@Klaus D在評論中指出的那樣,我的錯誤是在線程定義中指定目標函數時使用了花括號,從而導致該函數立即被調用。

target = self.update()將立即調用該方法。 刪除(),將方法移交給線程而不調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM