スクリプトのお勉強 技術

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

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

執筆者:

関連記事

Django2.2 でのMySQL5.1対応

「対応」と書きながら、思い切り回避ですが。 マイグレーション時のエラー マイグレーションしたら、以下のエラーになりました。 $ pipenv run python3 manage.py migrate …

見守り用カメラを探したら意外とよかった

過去にこの記事のように実家とのビデオ通話を設定したことがあります。 が、実際には、1回しか使われませんでした。 使われない理由は、おそらく難しいから 設定も難しいですし、そもそも両親が使い始めるのも難 …

MySQL MCP Serverを設定/動作確認してみる

はじめに 今はやりの生成AIとして、LLM(ローカルAPI)とMySQLのMCP Serverを使用してチャットシステムを作ろうと思います。 その前に、前回作成したDBへのMySQL MCP Serv …

PythonでAESを使用して暗号/復号する

1.つづき Pythonで、PKCS#12の公開鍵で暗号、秘密鍵で復号するプログラムの続きです。 今回はAESで暗号化/復号を行い、通信しながらRSA暗号/復号,AES暗号/復号を組み合わせたいと思い …

Pythonパッケージ管理の歴史

歴史っても、あまり過去に興味がないので、、 Pythonのパッケージ管理の歴史は、常に流動的で、そもそもからして、とてもじゃないがまとめて説明できるようなものではないです。 はっきり言って昔からよく分 …

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