スクリプトのお勉強 技術

Python3でMongoDBを使ってみる(MongoEngine)

投稿日:

仕事している過程で、ふと疑問に思うことがありました。非同期についてです。

非同期問題を解決する方法はたくさんあると思いますが、MongoDBで解決できるのかが気になったので
試してみました。

非同期問題とは

ここでの非同期問題とは、例として、2プロセスがディレクトリにあるデータを操作することを考えます。

  • Aプロセスでデータを新規書込/削除
  • Bプロセスでデータを読込/追記

の場合、以下の問題が考えられます。

  • Aプロセスが削除したデータをBプロセスが読込、あるいは追記する
  • Bプロセスが追記したデータをAプロセスが上書きする

ことが生じます。

いずれも操作対象オブジェクト一覧をロックしようがないためです。

さて、MongoDBで同様のことを処理するとどうなるか?を試してみました。

テスト環境

使用した環境は以下です。

  • WSL2 (Windows 10)
  • ubuntu 22.04(LTS)
  • Python 3.10.2
  • MongoDB 7.0.5

MongoDBのインストール

https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-ubuntu/#install-mongodb-community-edition

systemdではなく手動で起動しました。

$ sudo apt-get install -y mongodb-org
$ sudo mongod

テストコード

ここのような実装をしてみました。

MongoDBのアクセスはMongoEngineを使用しています。

各プロセスは以下を行います。

プロセスA

  • User(MongoDBではCollection)を生成
  • 乱数によりデータ新規or追記、あるいは削除

プロセスB

  • 全Userデータを取得し、乱数により追記

条件付きでエラーを防げる

各プロセスで以下のように一覧取得後(User.objects)にデータが削除された場合、e_idがNoneになるようです。

for u in User.objects:
...
    if not u.e_id:   <--- 一覧として取得してるはずなのにデータがない
        continue

結論: MongoDBを使用すると条件付きで非同期処理が可能

ということで、実装次第で「非同期処理」が可能なようです。

参考

https://mongoengine-odm.readthedocs.io/apireference.html
https://docs.mongoengine.org/projects/flask-mongoengine/en/latest/session_interface.html
https://qiita.com/key/items/b3894c64161a02d10649

-スクリプトのお勉強, 技術

執筆者:

関連記事

小ネタ: JavaScriptにてBase64エンコード/デコードする方法

小ネタです。JavaScriptにてBase64エンコード/デコードをしようとして、意外と詰まったので、メモ的に方法を書いておきます。 結論: js-base64ライブラリを使用する これだけです。。 …

pysnmp v6 から v7 への移行

はじめに 前回の記事でPythonによるSNMPTrapの送信について記事を書きました。 その後、PythonからのSNMPTrap送信する方法を調査したら、方法が変わっていることに気づきしました。 …

最近の故障/修正物

近年で故障し、しょうがないから修理、というか購入したもの、及び顛末を書いてみます。 ハードディスク・レコーダー ちょっと前から調子が悪く、電源がつかなかったり、ついたと思ったら、録画物のリストがおかし …

Pipenvでライブラリ(*.whl)をキャッシュする方法

仕事でWebアプリケーションを作成した場合、ガンガンとライブラリのバージョンを上げたりはしない場合があります。 そして、長期間放置されるタイプのWebアプリケーションの場合、使用しているライブラリが、 …

CentOS7 + Django2.2 + uwsgi + nginx 連携方法

Djangoとnginx連携方法 以前はApache経由で連携しましたが、今回はnginxと連携する方法を記述します。 環境 設定した環境は以下です。 OS: CentOS7Python3.6.8 ( …

    google オプトアウト Click here to opt-out.