我最近想开发一个HTTP服务器前端来包装我的ipcontroller / ipengine集群程序。服务器是从BaseHTTPServer派生的简单服务器。当服务器收到HTTP Get请求时,其do_GET方法将调用几个mec.execute()方法来完成作业。这是代码示例。
do_GET
{
b = parameter
mec.scatter("a", b)
mec.execute("c=fun(a)")
d = mec.gather("c")
write d
}
我会在声明mec.execute(“c = fun(a)”)中遇到同步问题吗?根据我的猜测,将在每个ipengie创建一个变量“c”,其值为“fun(a)”。如果两个线程同时使用不同的参数调用do_Get方法,那么每个ipengine的“c”值将是多少。
答案 0 :(得分:1)
如果您可以将任务表达为单个并行函数调用,那么您应该是安全的,因为没有其他请求可以潜入其中(并且不需要触及引擎全局变量),例如:
from IPython import parallel
rc = parallel.Client()
view = rc[:]
@view.parallel(block=True)
def pfun(a):
"""each engine will get a chunk of a, not the whole thing"""
c = fun(a)
return c
# a will be scattered and c will be gathered
c = pfun(a)
但如果没有,那么最简单的解决方案可能是通过为给定请求提供具有UUID的唯一后缀来确保您没有跨作业的名称冲突:
import uuid
suffix = str(uuid.uuid4()).replace('-','') # remove '-' so we have a valid identifier
a_name = "a_" + suffix
c_name = "c_" + suffix
mec.scatter(a_name, b)
mec.execute("%s = fun(%s)" % (c_name, a_name))
d = mec.gather(c_name)