Django:在多处理中,django.db.connection.close()是否安全(无数据丢失)?

时间:2018-08-21 03:24:02

标签: django postgresql psycopg2

我正在使用django 1.11PostgreSQL9.5psycopg2库。

这是我的项目的示例代码结构:

def lets_save_data(data_to_save):   
    # Insert data into the Database
    for data in data_to_save:
        MY_MODEL.objects.create(
            ...
        )

data_list_list = [
    [{'a':1, 'b':2, 'c':3}, {'a':4, 'b':5, 'c':6}, ...],
    [{'a':5, 'b':5, 'c':2}, {'a':1, 'b':4, 'c':3}, ...],
    ....
]
with Pool(12) as p:
    p.map(
        lets_save_data,
        [data_list for data_list in data_list_list]
    )

运行这些代码时,遇到psycopg2.OperationalError错误,如下所示:

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/rightx2/.pyenv/versions/3.6.2/lib/python3.6/multiprocessing/process.py", line 249, in _bootstrap
    self.run()
  File "/home/rightx2/.pyenv/versions/3.6.2/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/home/rightx2/Dropbox/Programming/Workspace/django/super_trading_project/super_trading/data_manager/managers/upbit_manager.py", line 97, in store_orderquote
    symbol = Symbol.objects.get(market="upbit", currency=currency, code=code)
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/models/query.py", line 374, in get
    num = len(clone)
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/models/query.py", line 232, in __len__
    self._fetch_all()
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/models/query.py", line 1118, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 899, in execute_sql
    raise original_exception
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 889, in execute_sql
    cursor.execute(sql, params)
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/home/rightx2/.pyenv/versions/super_trading_project/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.OperationalError: SSL SYSCALL error: EOF detected

我为解决这个问题所做的是:

def lets_save_data(data_to_save):
    from django.db import connection
    connection.close()

    # Insert data into the Database
    for data in data_to_save:
        MY_MODEL.objects.create(
            ...
        )

但是,我认为connection.close()操作会使数据库其他进程突然关闭,因此可能会发生数据丢失?像A process即将在DB中插入数据时,B process调用connection.close()A process无法插入数据。

解决问题是否安全?

0 个答案:

没有答案
相关问题