与所有与线程相关的事情一样,问题是“您是否使它成为线程安全的”?
如果您的用户服务如下所示:
# 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
将是线程安全的。另一方面,如果您执行以下操作:
# 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. ...
现在,包括db = database.connect()
在您的每个服务方法的顶部是非常不干燥的。您可以通过将特定于连接的工作包装在装饰器中来避免该问题(例如):
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. ...