我正在使用django 1.11
和PostgreSQL9.5
和psycopg2
库。
这是我的项目的示例代码结构:
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
无法插入数据。
解决问题是否安全?