1

我曾经使用基于 django 的前端填充数据库,然后使用我的守护程序软件中的数据直接访问 mysql 数据库。

现在我想将django模型直接集成到daemon软件中,让开发更容易。

所以写了这个类:

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()

现在我想知道:这个线程安全吗?

我可以从该类创建一个对象并将其传递给多个线程吗?

当我添加写入数据库的函数时,这会保持不变吗?

4

1 回答 1

2

您需要详细说明线程安全的含义。如果您不打算使用锁,那么它当然不是线程安全的。例如,

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

如果 3 个线程同时执行,显然会不一致。但是,SomeModel.objects.filter(pk=1).update(field=2)实际上是线程安全的。用于transaction.atomic()维护线程安全。尽管同时产生大量线程并连接到数据库可能会出现问题,但请确保允许您按计划打开尽可能多的连接。

一种有效的方法是让一个线程执行所有数据库交互,而其他线程执行计算或任何您的计划。在 a 上传递对象以Queue进行同步。

于 2014-10-07T11:27:58.067 回答