- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在多个线程中运行多个 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/
我觉得这应该不是那么难,但到目前为止我收效甚微。 假设我有一个名为 PikaClass 的类,它包装了 pika并提供了一些业务方法。 def PikaClass(object): def __i
我正在使用tornado.ioloop.IOLoop.run_in_executor将同步函数更改为异步,但事实证明,每次调用该函数时,都会创建一个线程,但不会杀死该线程。 这是一个最小的可重现示例(
我正在使用 Tornado 进行网络聊天,并且混淆了 IOLoop.add_callback 和 IOLoop.add_timeout。 据我所知,IOLoop.add_timeout 有一个特定的时
我是 Tornado 的新手。我构建了这个非常基本的 Tornado 请求处理程序,我预计它会在 GET 上返回“Hello World”: import tornado import tornado
我正在尝试在 Tornado 中运行多个进程,我尝试了在此线程上提出的建议:run multiple tornado processess 但错误并没有消失。这是服务器文件。 server.py im
我正在使用以下代码优雅地关闭我的 Tornado 应用程序(取自 https://gist.github.com/wonderbeyond/d38cd85243befe863cdde54b845057
Python Tornado 的 IOLoop.add_handler(fd,handler,events) 表示“fd 参数可以是整数文件描述符,也可以是具有 fileno() 方法的类文件对象”,
我需要使用 Tornado 实现一个简单的服务。当我的服务启动时,它会创建第二个线程,我需要在这个线程中运行 Tornado 的 ioloop,因为同时主线程正忙于做一些其他工作。在第二个线程中使用
我一直在研究 tornado web 框架,但我仍然没有清楚地理解 ioloop 的功能,尤其是如何在多线程中使用它。是否可以为多个服务器创建单独的 ioloop 实例?? 最佳答案 绝大多数 Tor
你好吗? 最近几天我经历了这个麻烦,我似乎无法完全理解tornado gen库。 我有这段代码,作为示例: @gen.coroutine def get(self, build_id=None):
我正在尝试在多个线程中运行多个 IOLoop,我想知道 IOLoop 实际上是如何工作的。 class WebThread(threading.Thread): def __init__(se
我正在编写一些需要在 IPython 中异步运行后台任务的代码。对于在后台运行任务,我想我可以使用 IPython 使用的相同 Tornado ioloop。有没有办法获取当前 ioloop 实例的句
我想在后台线程中创建一个 PyZMQ 事件循环,并让它与独立的 Python 脚本和 IPython 脚本一起正常工作。 (IPython 使用位于主线程中的 PyZMQ 事件循环,因此这给我带来了问
我可以初始化一个 IOLoop.instance 并 fork 使用 IOLoop.instance() 的新进程吗?就像是: #some code which initializes IOLoop.
我想编写一个单线程程序来托管使用 Tornado 的网络服务器并在 ZMQ 套接字上接收消息(使用 PyZMQ Tornado 事件循环:http://learning-0mq-with-pyzmq.
我有一个脚本需要异步连接到 TCP 服务器并使用 TornadoWeb (3.2) 发送一些数据。 这是简短版本: import tornado.ioloop import tornado.iostr
我需要能够优雅地停止在 Pika ioloop 中工作的消费者(工作人员)。工作人员应在 60 秒后停止。当前处理的消息应该完成。 我试图在回调函数中放置一个 connection.close() 但
我有一个应用程序,其中每个 websocket 连接(在 tornado 打开回调中)都会创建一个 zmq.SUB 套接字到现有 zmq.FORWARDER 设备。想法是从 zmq 接收数据作为回调,
我有一个带有两个处理程序的简单 aiohttp-server。第一个在 async for 循环中进行一些计算。第二个只返回文本响应。 not_so_long_operation 以最慢的递归实现返回
为了弄清楚 PeriodicCallback 是如何安排的,我写了这个脚本: import time import tornado.ioloop t0 = time.time() def foo():
我是一名优秀的程序员,十分优秀!