use*_*632 3 python django multiprocessing django-queryset
我用Django 1.11.1和PostgreSQL作为数据库。
这是代码:
模型.py
class Symbol(StockDataBaseModel):
code = models.CharField(max_length=20)
name = models.CharField(max_length=30)
class DailyPrice(StockDataBaseModel):
symbol = models.ForeignKey(Symbol)
date_time = models.DateTimeField()
open = models.DecimalField(max_digits=15, decimal_places=2)
high = models.DecimalField(max_digits=15, decimal_places=2)
low = models.DecimalField(max_digits=15, decimal_places=2)
close = models.DecimalField(max_digits=15, decimal_places=2)
Run Code Online (Sandbox Code Playgroud)
获取数据部分
def _get_price_df(ticker, start_date, end_date):
from data_manager.models import DailyPrice, Symbol
symbol_set = Symbol.objects.prefetch_related('dailyprice_set').filter(name__iexact=ticker)
if symbol_set.exists():
symbol = symbol_set[0]
if start_date and end_date:
price_set = symbol.dailyprice_set.filter(Q(date_time__gte=start_date) & Q(date_time__lte=end_date))
elif start_date:
price_set = symbol.dailyprice_set.filter(Q(date_time__gte=start_date))
elif end_date:
price_set = symbol.dailyprice_set.filter(Q(date_time__lte=end_date))
else:
price_set = symbol.dailyprice_set.all()
else:
raise ValueError("No such ticker exists : {}".format(ticker))
class StockDailyDataManager(object):
def get_price_data_df(self, tickers, start_date=None, end_date=None):
pool = Pool(12)
df_list = pool.starmap(
_get_price_df, [(ticker, start_date, end_date) for ticker in tickers]
)
Run Code Online (Sandbox Code Playgroud)
我试过的:
tickers = ['MSFT', 'AAPL', 'samsung'...]
pool = Pool(12)
df_list = pool.starmap(
_get_price_df,
[(ticker, start_date, end_date) for ticker in tickers]
)
Run Code Online (Sandbox Code Playgroud)
它发生错误:
django.db.utils.OperationalError: SSL error: decryption failed or bad record mac
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我在管理命令中使用了它,其中使用了多处理池。打电话
from django import db
db.connections.close_all()
Run Code Online (Sandbox Code Playgroud)
在每个过程的最开始都有帮助。然后,当从进程内部访问数据库时,该进程创建了一个新连接,并没有尝试从父级共享原始连接。