2014-10-07 42 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