Python 如何在Behave环境设置期间运行Tornado IO循环

Python 如何在Behave环境设置期间运行Tornado IO循环,python,bdd,tornado,Python,Bdd,Tornado,在我正在工作的项目中,我需要介绍一个服务,所以我想在运行每个场景之前启动我的tornado服务的一个实例 天真地尝试将循环作为一部分运行,似乎锁定了执行: from tornado import ioloop from tornadoadapter.applications import APPLICATION def before_all(context): print "Service running on port 8000" APPLICATION.listen(80

在我正在工作的项目中,我需要介绍一个服务,所以我想在运行每个场景之前启动我的tornado服务的一个实例

天真地尝试将循环作为一部分运行,似乎锁定了执行:

from tornado import ioloop
from tornadoadapter.applications import APPLICATION


def before_all(context):
    print "Service running on port 8000"
    APPLICATION.listen(8000)
    ioloop.IOLoop.instance().start()

所以这可能不是我需要的。

您的IOLoop正在主线程中运行,所以它被阻塞了。您可以在单独的线程或进程中完成

from multiprocessing import Process

from tornado import ioloop
from tornadoadapter.applications import APPLICATION


def run_server():
    print "Service running on port 8000"
    APPLICATION.listen(8000)
    ioloop.IOLoop.instance().start()


def before_all(context):
    context.server_thread = Process(target=run_server)
    context.server_thread.deamon = True
    context.server_thread.start()

当我尝试在Windows上运行此操作时,会出现以下异常:
pickle.PicklingError:无法pickle:找不到它作为_umain__;。运行服务器
听起来像是您的
运行服务器
函数不可拾取。要快速检查的是,您是否可以实际导入
运行\u服务器
?i、 e.如果是lambda或内部函数,则在所有之前执行
,它将不起作用。
运行服务器
的定义与代码示例中的定义相同;它在同一个文件中,就在定义\u all
之前。