gpt4 book ai didi

python - 多线程中的 Tornado 多个 IOLoop

转载 作者:行者123 更新时间:2023-11-28 22:34:53 24 4
gpt4 key购买 nike

我正在尝试在多个线程中运行多个 IOLoop,我想知道 IOLoop 实际上是如何工作的。

class WebThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self, name='WebThread')

def run(self):
curdir = os.path.dirname(os.path.realpath(__file__))

application = Application() #Very simple tornado.web.Application
http_server_api = tornado.httpserver.HTTPServer(application)
http_server_api.listen(8888)

logging.info('Starting application')

#tornado.ioloop.IOLoop.instance() is singleton, not for thread, right?

ioloop = tornado.ioloop.IOLoop()
ioloop.make_current()
ioloop.start()

根据文档,我不能使用 IOLoop.instance(),因为它是一个单例并且我在一个线程中工作。所以我创建了自己的 IOLoop。但是这段代码监听8888端口却无法渲染任何网页。我想知道是否遗漏了什么,或者我是否需要以某种方式将 http_server 绑定(bind)到 IOLoop?

此外,我发现删除最后 3 行并替换为 tornado.ioloop.IOLoop.instance().start 非常适合单线程。但是单例和自创IOLoop有什么区别呢?

我是 Tornado 的新手,欢迎任何回答。

最佳答案

In general you should use IOLoop.current as the default when constructing an asynchronous object, and use IOLoop.instance when you mean to communicate to the main thread from a different one.

IOLoop.current没有参数返回已经创建的线程的ioloop或者它调用IOLoop.instance()。并且 HTTPServer(实际上在 TCPServer 中)使用 IOLoop.current 与 ioloop 交互,所以你唯一应该改变的是在 HTTPServer 之前创建 ioloop,例如

class WebThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self, name='WebThread')

def run(self):
curdir = os.path.dirname(os.path.realpath(__file__))

ioloop = tornado.ioloop.IOLoop()

application = Application() #Very simple tornado.web.Application
http_server_api = tornado.httpserver.HTTPServer(application)
http_server_api.listen(8888)

logging.info('Starting application')

ioloop.start()

我还删除了 IOLoop.make_current,因为它是多余的 - IOLoop() 将 self 设置为电流。


上面的代码可以工作,但只适用于一个线程,因为默认情况下不启用 reuse_port。你最终会得到:

OSError: [Errno 98] Address already in use

你可以用

启用它
    http_server_api.bind(port=8888, reuse_port=True)
http_server_api.start()

代替 http_server_api.listen(8888)

关于python - 多线程中的 Tornado 多个 IOLoop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38644963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com