我曾经使用基于django的前端填充数据库,然后使用我的守护程序软件中的数据直接访问mysql数据库。
现在我想直接将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()
现在我想知道:这个线程安全吗?
我可以从该类创建一个对象并将其传递给多个线程吗?
当我添加写入数据库的函数时,这仍然是正确的吗?
答案 0 :(得分:1)
您需要详细说明线程安全的含义。如果您不打算使用锁,那么它当然不是线程安全的。例如,
s = SomeModel.objects.get(pk=1)
s.field = 2
s.save()
如果3个线程同时执行它,那么显然不一致。但是,SomeModel.objects.filter(pk=1).update(field=2)
实际上是线程安全的。使用transaction.atomic()
来保持线程安全。虽然,可能会出现产生大量线程并同时连接到数据库的问题,但请确保您可以按计划打开任意数量的连接。
执行此操作的有效方法是让一个线程执行所有数据库交互,而其他线程正在执行计算或任何计划。传递Queue
上的对象以进行同步。