我有一个web2pywebapp,它是一个blastn脚本的web接口。现在我需要限制进程同时运行,我的想法是
当webapp启动时,我的做法是默认.py公司名称:
available_worker = multiprocessing.cpu_count() - 1
def get_workers():
global available_worker
return available_worker
def consume_worker():
global available_worker
available_worker = available_worker - 1
def free_worker():
global available_worker
available_worker = available_worker + 1
def index():
if get_workers() > 0:
consume_worker()
# run a script
free_worker()
print get_workers()
显然,它不会像每次加载web时一样工作,它会将可用的工作线程重置为multiprocessing.cpu_count() - 1
。在
我只是想知道,是否有一种方法可以在web会话或用户之间共享可用的worker。在
所以当用户a加载页面时,available_worker
是2,他运行脚本。当用户A运行脚本时,用户B加载webapp,得到available_worker
为1,然后运行脚本。当A和B运行脚本时,A用户C来了,他得到available_worker
为0,所以他必须等到A或B完成脚本后才能运行脚本。在
我是新编程,详细的解释和示例代码将非常感谢。在
谢谢。在
我刚刚意识到我真正的问题是,当启动一个web2py应用程序时,如何初始化一个变量,这个变量只有在web2py第一次启动时才会被初始化。然后会话/使用可以更新变量值。我发现我的代码的问题是,每次页面加载时,它都会将值重置为多处理.cpu_计数()-1,即使我将数据存储到数据库中,也会得到相同的结果。在
如果需要跨用户全局共享一些数据,可以使用web2pycache功能。如果您在单个进程中运行web2py,您可以简单地使用} 。正如其他人建议的那样,您也可以简单地使用数据库。在
cache.ram
(也可以将变量放在模块的顶层并导入)。否则,请使用cache.disk
或^{作为替代,您可以考虑使用web2py的内置scheduler来处理这个问题。您可以启动任意数量的调度工作程序,这将限制可以同时运行的任务的数量。在
如果使用得当,数据库将解决问题:每个函数都将从数据库中读取值并更新那里的值。如果数据库中的值尚未初始化,请像在当前代码中那样初始化它。在
如果你不能使用数据库,也许一个外部文本文件就可以了。在
至于实现:在当前代码中,无论您在何处访问
available_worker
的值,都要从外部资源获取它;无论您在哪里更改它,都要更新该外部资源。在要在服务器启动时(重新)初始化此资源,您必须离开任何单独的应用程序;例如,您可以修改
gluon.widget.py
,因为它负责实际启动服务器。在请注意,因为web2py控制器中没有任何参数的任何函数都可以作为网页访问,
worker
函数也可以访问,即使它们看起来不像您希望的那样。在或许可以看看Python Multiprocessing library。在
相关问题 更多 >
编程相关推荐