我正在使用python编写带有时间戳的OrderedDict,我遇到了问题.我尝试编码的数据如下所示:
OrderedDict([('a', datetime.datetime(2015, 6, 15, 15, 58, 54, 884000)), ('b', 'b'), ('c', 'c'), ('d', 'd')])
Run Code Online (Sandbox Code Playgroud)
我希望这是json编码和解码,以获得完全相同的数据.
为了直接编码时间戳,而不改为ISO或Unix时间,我使用了bson的json_util接口,如下所示.它工作正常.
json.dumps(str, default=json_util.default)
json.loads(jsonstr, object_hook=json_util.object_hook)
Run Code Online (Sandbox Code Playgroud)
为了获得OrderedDict我使用了object_pairs_hook,它也有效:
json.loads(x, object_pairs_hook=OrderedDict)
Run Code Online (Sandbox Code Playgroud)
但是,当一起使用时,这两个东西相互混淆,结果的格式不正确(因为bson接口正在为时间戳创建一个额外的字典).
json.loads(jsonstr, object_hook=json_util.object_hook, object_pairs_hook=OrderedDict)
Run Code Online (Sandbox Code Playgroud)
此查询最终得到此:
OrderedDict([(u'a', OrderedDict([(u'$date', 1434383934884L)])), (u'b', u'b'), (u'c', u'c'), (u'd', u'd')])
Run Code Online (Sandbox Code Playgroud)
时间戳未正确解析.有关如何正确做到这一点的任何建议?(Pickle可能是一个方向,但我首先寻求其他解决方案).
这个问题已经困扰了我几天了。我通过打开多个线程使用 RabbitMQ 运行多个使用者,但出现以下错误。
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 905, in queue_declare
None, replies)
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 1141, in _rpc
self._wait_on_response(method_frame))
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 1162, in _send_method
self.connection.process_data_events()
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 240, in process_data_events
if self._handle_read():
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 347, in _handle_read
if self._read_poller.ready():
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 43, in inner
return f(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 85, in ready
events = self.poller.poll(self.poll_timeout)
RuntimeError: concurrent poll() invocation
Run Code Online (Sandbox Code Playgroud)
许多谷歌搜索使我找到了问题 8865,它描述了如何不能同时调用 select.poll() 函数。并且此错误可以由以下脚本一致触发:
import os
import select
import threading
import time
p = select.poll() …Run Code Online (Sandbox Code Playgroud) 我正在尝试在多个线程中运行多个 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()
Run Code Online (Sandbox Code Playgroud)
根据文档,我不能使用 IOLoop.instance() 因为它是一个单例并且我在一个线程中工作。所以我创建了自己的 IOLoop。但是这段代码监听了8888端口却无法渲染任何网页。我想知道是否遗漏了什么,或者我是否需要以某种方式将 http_server 绑定到 IOLoop?
此外,我发现删除最后 3 行并替换tornado.ioloop.IOLoop.instance().start为单线程完美。但是单例和自创IOLoop有什么区别呢?
我是 Tornado 的新手,欢迎提供任何答案。