Django では、update というカスタム コマンドを作成しました。このコマンドは、シェル スクリプトによって継続的に呼び出され、データベース内のいくつかの値を更新します。更新はスレッドで行われます。カスタムコマンドと同じモジュールに、オールスレッド関連の処理を行うクラスを配置しました。
本番サーバーで、そのシェル スクリプトを実行しようとすると、モデルにアクセスしようとするとエラーが発生します。
antennas = Antenna.objects.all()
エラーは次のとおりです。
AttributeError: 'NoneType' object has no attribute 'objects'
ただし、ご覧のとおり、そのファイルに app.models.Antenna をインポートしました。だから私には、サイト全体への参照がスレッドクラス内でどういうわけか「失われた」ように見えます。
サイト/アプリ/管理/コマンド/update.py
(すべてが雑然とするので、重要でないコードはここですべて削除しようとしましたが、インポートはそのまま残しました)
from django.core.management.base import NoArgsCommand, CommandError
from django.utils import timezone
from datetime import datetime, timedelta
from decimal import *
from django.conf import settings
from _geo import *
import random, time, sys, traceback, threading, Queue
from django.db import IntegrityError, connection
from app.models import Bike, Antenna
class Command(NoArgsCommand):
def handle_noargs(self, **options):
queue = Queue.Queue()
threadnum = 2
for bike in Bike.objects.filter(state__idle = False):
queue.put(bike)
for i in range(threadnum):
u = UpdateThread(queue)
u.setDaemon(True)
u.start()
queue.join()
return
class UpdateThread(threading.Thread):
def init(self, queue):
threading.Thread.init(self)
self.queue = queue
def run(self):
antennas = Antenna.objects.all()
while not self.queue.empty():
try:
[...]
except Exception:
traceback.print_exc(file=sys.stdout)
finally:
self.queue.task_done()
しようとすると
from app.models import Antenna
UpdateThread-class 内でエラーが発生します。
ImportError: No module named app.models
サイトはウェブサーバー上でうまく動作します。スレッド内で何かを行う場合にのみ、モデル関連の問題はありません-すべての app.models-imports が失敗しています。さらに、まったく同じ構成(私はgitを使用しています)が同じオペレーティングシステム(debian wheezy、python 2.7.3rc2およびdjango 1.4.2)を実行する別のマシンで実行されるように思えます。
ここでのスレッド化について明らかな何かが欠けている可能性が非常に高いですが、あまりにも長い間立ち往生しています。あなたの助けは非常に高く評価されます!
PS: 循環インポートを確認しましたが、モデルを他の (管理) クラスで使用できるため、とにかく発生しないはずですよね?