如何在没有数据库的情况下在Web2Py中共享变量

2024-05-20 23:46:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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,即使我将数据存储到数据库中,也会得到相同的结果。在


Tags: 用户脚本webfreegetdefcountcpu
3条回答

如果需要跨用户全局共享一些数据,可以使用web2pycache功能。如果您在单个进程中运行web2py,您可以简单地使用cache.ram(也可以将变量放在模块的顶层并导入)。否则,请使用cache.disk^{}。正如其他人建议的那样,您也可以简单地使用数据库。在

作为替代,您可以考虑使用web2py的内置scheduler来处理这个问题。您可以启动任意数量的调度工作程序,这将限制可以同时运行的任务的数量。在

如果使用得当,数据库将解决问题:每个函数都将从数据库中读取值并更新那里的值。如果数据库中的值尚未初始化,请像在当前代码中那样初始化它。在

如果你不能使用数据库,也许一个外部文本文件就可以了。在

至于实现:在当前代码中,无论您在何处访问available_worker的值,都要从外部资源获取它;无论您在哪里更改它,都要更新该外部资源。在

要在服务器启动时(重新)初始化此资源,您必须离开任何单独的应用程序;例如,您可以修改gluon.widget.py,因为它负责实际启动服务器。在

请注意,因为web2py控制器中没有任何参数的任何函数都可以作为网页访问,worker函数也可以访问,即使它们看起来不像您希望的那样。在

相关问题 更多 >