我threadsafe: true
在我的 app.yaml 中使用 Google App Engine 1.7.4 上的 Python 2.7 运行时。
我有以下代码:
@ndb.tasklet
def fn_a(container):
''' access datastore and mutate container '''
@ndb.tasklet
def fn_b(container):
''' access datastore and mutate container '''
@ndb.toplevel
def parallel_fn():
shared_container = set()
yield fn_a(shared_container), fn_b(shared_container)
fn_a()
并且fn_b()
access 和 mutateshared_container
都被调用parallel_fn()
。shared_container
是一个标准库set
,因此不是线程安全的。
我应该将 mutator/accessor 方法包装shared_container
在适当的threading
标准库锁中吗?
根据我对 App Engine 的了解,每个实例都是单线程的,尽管设置了threadsafe: true
. 因此threading
不需要使用锁定对象吗?
初步测试表明锁不是必需的,只会增加额外的开销和死锁。似乎也不应该做以下事情
if object not in shared_container:
yield any tasklet operation
shared_container.add(object)
shared_container
可能会在操作期间由另一行执行更新,从而yield
使object not in shared_container
语句可能无效。然而
if object not in shared_container:
shared_container.add(object)
yield any tasklet operation
绝对没问题。