スレッド関連のすべてと同様に、問題は「スレッドセーフにしましたか」です。
ユーザーサービスは次のようになります場合:
# user_service.py
from some.package import database
def add_user(user_information=None):
db = database.connect()
db.insert(user_information)
def update_user(user_information=None):
db = database.connect()
db.update(user_information["user_id"], user_information)
def delete_user(user_id=None):
db = database.connect()
db.delete(user_id)
その後、それはスレッドセーフになりますsome.package.database
のも、リモートでまともな実装を想定しました。一方、あなたはこのような何かをした場合:あなたのサービス・メソッドのそれぞれの上部にdb = database.connect()
含め今
# bad_user_service.py
from some.package import database
# Shared single connection
# Probably *not* thread safe
db = database.connect()
def add_user(user_information=None):
db.insert(user_information)
# ... etc. ...
は、非常に非DRYです。
def provide_db(func):
@functools.wraps(func)
def new_function(*args, **kwargs):
db = database.connect()
return func(db, *args, **kwargs)
return new_function
は、その後、あなたがこれを行うことができます:
# user_service.py
from your.data.layer import provide_db
@provide_db
def add_user(db, user_information=None):
db.insert(user_information)
# ... etc. ...
いいえ、以下の[PEP8](HTTP:/あなたは(例えば)デコレータであなたの接続固有の仕事をラップすることにより、その問題を回避することができます/www.python.org/dev/peps/pep-0008/)それは 'user_service'と呼ばれ、関数は' add_user'と 'delete_user'でなければなりません。 Pythonには、コードを記述するための独自の規則があります。Javaスタイルの名前などを使用しないでください。 – Bakuriu
okありがとう、この関数は直接関数を呼び出すだけです。 user_servier.add_user()はコントローラメソッドで安全です。 – imrank1