質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

819閲覧

websocketのpushAPI受信時の並行処理方法とデータベースの取り扱いについて相談

taro_yamada

総合スコア55

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/14 12:06

今、株の板情報のpushAPIを受信、加工、データベースへの保存するプログラムを書いています。
データ量はカラム数が80程度、1日の行数が9時から15時までの間に40万件程度あります。

今、インターネットのソースコードをコピーして、djangoのORM(postgreSQL)を使ってスレッド処理をしています。
データ受信後の加工については、今後もう少しだけ複雑にするつもりです。

ついては、以下の観点で質問があります。

①スレッドで処理していますが、データの処理が追い付かずに拾いきれない場合が生じる可能性がありますでしょうか。(その場合、対策として非同期処理asyncioなど考えた方がいいでしょうか?)

②スレッドで処理し続けた場合、データベースにロックがかかってしまうリスクはありえるでしょうか?(その場合の対処方法があればご教示ください。)

ちなみに、djangoは、テーブルのマッピングとクエリの記載が楽だからという理由で採用しています。

どうぞよろしくお願いいたします。

python

1 2 def kabu_spi_push(self): 3 url = 'ws://localhost:18080/kabusapi/websocket' 4 # websocket.enableTrace(True) 5 ws = websocket.WebSocketApp(url, 6 on_message=self.on_message, 7 on_error=self.on_error, 8 on_close=self.on_close) 9 ws.on_open = self.on_open 10 ws.run_forever() 11 12 def on_message(ws, message): 13 try: 14 content = json.loads(message) 15 newPushData = pushList( 16 Symbol=content['Symbol'], 17 SymbolName=content['SymbolName'], 18 Exchange=content['Exchange'], 19 ExchangeName=content['ExchangeName'], 20 CurrentPrice=content['CurrentPrice'], 21 CurrentPriceTime=content['CurrentPriceTime'], 22 CurrentPriceChangeStatus=content['CurrentPriceChangeStatus'], 23 CurrentPriceStatus=content['CurrentPriceStatus'], 24 CalcPrice=content['CalcPrice'], 25 PreviousClose=content['PreviousClose'], 26 PreviousCloseTime=content['PreviousCloseTime'], 27 ChangePreviousClose=content['ChangePreviousClose'], 28 ChangePreviousClosePer=content['ChangePreviousClosePer'], 29 OpeningPrice=content['OpeningPrice'], 30 OpeningPriceTime=content['OpeningPriceTime'], 31 HighPrice=content['HighPrice'], 32 HighPriceTime=content['HighPriceTime'], 33 LowPrice=content['LowPrice'], 34 LowPriceTime=content['LowPriceTime'], 35 TradingVolume=content['TradingVolume'], 36 TradingVolumeTime=content['TradingVolumeTime'], 37 VWAP=content['VWAP'], 38 TradingValue=content['TradingValue'], 39 BidQty=content['BidQty'], 40 BidPrice=content['BidPrice'], 41 BidTime=content['BidTime'], 42 BidSign=content['BidSign'], 43 MarketOrderSellQty=content['MarketOrderSellQty'], 44 Sell1Time=content['Sell1']['Time'], 45 Sell1Sign=content['Sell1']['Sign'], 46 Sell1Price=content['Sell1']['Price'], 47 Sell1Qty=content['Sell1']['Qty'], 48 Sell2Price=content['Sell2']['Price'], 49 Sell2Qty=content['Sell2']['Qty'], 50 Sell3Price=content['Sell3']['Price'], 51 Sell3Qty=content['Sell3']['Qty'], 52 Sell4Price=content['Sell4']['Price'], 53 Sell4Qty=content['Sell4']['Qty'], 54 Sell5Price=content['Sell5']['Price'], 55 Sell5Qty=content['Sell5']['Qty'], 56 Sell6Price=content['Sell6']['Price'], 57 Sell6Qty=content['Sell6']['Qty'], 58 Sell7Price=content['Sell7']['Price'], 59 Sell7Qty=content['Sell7']['Qty'], 60 Sell8Price=content['Sell8']['Price'], 61 Sell8Qty=content['Sell8']['Qty'], 62 Sell9Price=content['Sell9']['Price'], 63 Sell9Qty=content['Sell9']['Qty'], 64 Sell10Price=content['Sell10']['Price'], 65 Sell10Qty=content['Sell10']['Qty'], 66 AskQty=content['AskQty'], 67 AskPrice=content['AskPrice'], 68 AskTime=content['AskTime'], 69 AskSign=content['AskSign'], 70 MarketOrderBuyQty=content['MarketOrderBuyQty'], 71 Buy1Time=content['Buy1']['Time'], 72 Buy1Sign=content['Buy1']['Sign'], 73 Buy1Price=content['Buy1']['Price'], 74 Buy1Qty=content['Buy1']['Qty'], 75 Buy2Price=content['Buy2']['Price'], 76 Buy2Qty=content['Buy2']['Qty'], 77 Buy3Price=content['Buy3']['Price'], 78 Buy3Qty=content['Buy3']['Qty'], 79 Buy4Price=content['Buy4']['Price'], 80 Buy4Qty=content['Buy4']['Qty'], 81 Buy5Price=content['Buy5']['Price'], 82 Buy5Qty=content['Buy5']['Qty'], 83 Buy6Price=content['Buy6']['Price'], 84 Buy6Qty=content['Buy6']['Qty'], 85 Buy7Price=content['Buy7']['Price'], 86 Buy7Qty=content['Buy7']['Qty'], 87 Buy8Price=content['Buy8']['Price'], 88 Buy8Qty=content['Buy8']['Qty'], 89 Buy9Price=content['Buy9']['Price'], 90 Buy9Qty=content['Buy9']['Qty'], 91 Buy10Price=content['Buy10']['Price'], 92 Buy10Qty=content['Buy10']['Qty'], 93 OverSellQty=content['OverSellQty'], 94 UnderBuyQty=content['UnderBuyQty'], 95 TotalMarketValue=content['TotalMarketValue'] 96 ) 97 newPushData.save() 98 print('--- RECV MSG. --- ') 99 100 except Exception as e: 101 print("test") 102 print(e) 103 104 def on_error(ws, error): 105 print('--- ERROR --- ') 106 print(error) 107 108 def on_close(ws): 109 print('--- DISCONNECTED --- ') 110 111 def on_open(ws): 112 print('--- CONNECTED --- ') 113 114 def run(*args): 115 while (True): 116 line = sys.stdin.readline() 117 if line != '': 118 print('closing...') 119 ws.close() 120 121 _thread.start_new_thread(run, ()) 122

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問