小编She*_*ang的帖子

python - 使用带有OrderedDict和Datetime的json

我正在使用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可能是一个方向,但我首先寻求其他解决方案).

python json

5
推荐指数
1
解决办法
678
查看次数

Python 中的并发轮询问题

这个问题已经困扰了我几天了。我通过打开多个线程使用 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)

python rabbitmq

5
推荐指数
0
解决办法
965
查看次数

Tornado 多线程中的多个 IOLoop

我正在尝试在多个线程中运行多个 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 的新手,欢迎提供任何答案。

python multithreading tornado

3
推荐指数
1
解决办法
3688
查看次数

标签 统计

python ×3

json ×1

multithreading ×1

rabbitmq ×1

tornado ×1