2014-10-07 84 views
1

我曾經使用基於django的前端填充數據庫,然後使用守護進程軟件中的數據直接訪問mysql數據庫。django模型線程安全嗎?

現在我想直接將django模型集成到守護進程軟件中,以使開發更容易。

所以寫了這個類:

class DjangoMysqlConnector: 
    def __init__(self,SystemLogger=False): 
    path_list = ["/home/user/django/bildverteiler_project/", "/home/user/git/apps/"] 

    for path in path_list: 
     if path not in sys.path: 
     sys.path.append(path) 

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bildverteiler_project.settings") 
    django.setup() 

    from bildverteiler import models 
    self.models = models 

    def get_all_servers(self): 
    return models.Server.objects.all() 
    def get_all_verteilers(self): 
    return models.Verteiler.objects.all() 

現在我想知道:這是線程安全的?

我可以從該類創建一個對象並將其傳遞給多個線程嗎?

當我添加寫入數據庫的函數時,這會保持真實嗎?

+1

我不能誠實地看到這個班的重點是什麼。它似乎沒有做任何有用的事情,並沒有存儲任何狀態。爲什麼不能在代碼中訪問'models.Server'等? – 2014-10-07 11:30:26

+0

我不想在我的應用程序中使用django代碼。另外,因爲我直接使用mysql,所以我只想替換現有的mysql-db-class。 – JasonTS 2014-10-07 11:32:40

回答

1

您需要詳細說明您的意思是線程安全。如果你不打算使用鎖,那當然它不是線程安全的。例如,

s = SomeModel.objects.get(pk=1) 
s.field = 2 
s.save() 

如果3個線程同時做它顯然不會一致。但是,SomeModel.objects.filter(pk=1).update(field=2)實際上是線程安全的。使用transaction.atomic()維護線程安全。儘管可能存在產生大量線程並同時連接到數據庫的問題,但請確保允許您按計劃打開多個連接。

這樣做的一種有效方法是讓一個線程執行所有數據庫交互操作,而其他線程正在進行計算或執行任何計劃。傳遞Queue上的對象以進行同步。

+0

如果我把它放在另一個線程中。我怎樣才能將接收到的db數據傳回給調用線程?我認爲插入很容易,但我如何訪問檢索到的數據?另外,當我插入我有時需要返回在調用線程產生的主鍵。 – JasonTS 2014-10-07 11:31:10

+0

如果您要舉一個例子,我會更有可能幫助您。 – Martol1ni 2014-10-07 11:32:18