0

DjangoORMを使用するデーモンを使用して非同期データ処理を行う方法を探しています。ただし、ORMはスレッドセーフではありません。スレッド内からdjangoオブジェクトを取得/変更しようとするのはスレッドセーフではありません。だから私は非同期を達成するための正しい方法は何であるか疑問に思っていますか?

基本的に、私が達成する必要があるのは、データベース内のユーザーのリストを取得し、サードパーティのAPIにクエリを実行してから、それらのユーザーのユーザープロファイル行を更新することです。デーモンまたはバックグラウンドプロセスとして。これをユーザーごとに連続して行うのは簡単ですが、スケーラブルになるには時間がかかりすぎます。デーモンがORMを介してユーザーを取得および更新している場合、一度に10〜20人のユーザーを処理するにはどうすればよいですか?これには標準のスレッド/キューシステムを使用しますが、次のような相互作用をスレッド化することはできません

models.User.objects.get(id=foo) ...

Django自体は、リクエストごとに非同期ORM呼び出し(?)を行う非同期処理システムなので、それを行う方法があるはずですか?これまでのところ、ドキュメントには何も見つかりませんでした。

乾杯

4

2 に答える 2

3

セロリを見てください。私はそれがあなたの問題を解決すると思います。マルチプロセッシングモジュールを使用しています。(非常に)小さなセットアップが必要ですが、スケーリングに大いに役立ちます。

于 2010-05-11T07:20:05.507 に答える
2

非同期処理が独自のプロセスで実行されている場合、スレッドはアドレススペースを共有していないため、スレッドセーフは問題にならず、相互に干渉することはありません。それぞれにモデルオブジェクトの独自のコピーがあります。同時実行性は、トランザクションを使用するデータベースによって制御されます。だからあなたの罰金。

非同期ビジネスを実行するためにWebサーバーのプロセスの1つにスレッドを生成する場合は、スレッドセーフではないすべてのAPI呼び出しをロックする必要があります。

from threading import Lock

Apacheは、fork()システムコールを介して複数のプロセスを使用して、同時Webリクエストを処理します。これが、DjangoのORMAPIがスレッドセーフである必要がない理由です。Apacheはプロセスの代わりにスレッドを使用できるかもしれないと思いますが、Djangoを使用するには機能を無効にする必要があると思います。

http://groups.google.com/group/django-developers/browse_thread/thread/905f79e350525c95

ところで、スレッドとプロセスの違いを理解していますか?その種類は重要です。

于 2010-05-11T06:32:49.460 に答える