小编Siv*_*nBH的帖子

皮卡连接在3次心跳后关闭

我正在编写一个接收HTTP请求(使用Tornado)的脚本,解析它们,并使用pika将它们发送到RabbitMQ代理.

代码如下所示:

def main():
    conn_params = pika.ConnectionParameters(
        host=BROKER_NAME,
        port=BROKER_PORT,
        ssl=True,
        virtual_host=VIRTUAL_HOST,
        credentials=pika.PlainCredentials(BROKER_USER, BROKER_PASS),
        heartbeat_interval=HEARTBEAT_INTERVAL
    )
    conn = pika.BlockingConnection(conn_params)
    channel = conn.channel()

    # Create the web server which handles application requests.
    application = tornado.web.Application([
        (URL_BILLING, SomeHandler, dict(channel=channel))
    ])

    # Start the server
    application.listen(LISTENING_PORT)
    tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

如您所见,我打开一个连接和通道,并将通道传递给创建的处理程序的任何实例,其目的是节省流量并避免为每个请求打开新的连接/通道.

我遇到的问题是连接在3次心跳后关闭.我使用Wireshark来弄清问题是什么,但我只能看到服务器发送PSH(我假设这是心跳)并且我的脚本回复了ACK.这种情况发生在HEARTBEAT_INTERVAL之间3次,然后服务器只发送一个FIN并且连接终止.

知道为什么会这样吗?另外,我应该保持连接打开还是更好地为我需要发送的每条消息创建一个新连接?

谢谢您的帮助.

更新:我查看了RabbitMQ日志,它说: Missed heartbeats from client, timeout: 10s 我认为服务器是为了向客户端发送心跳,以确保它的答案,这与我使用Wireshark观察到的一致,但是从这个日志看来它似乎是客户端本来要向服务器报告,而不是相反,客户端显然不会报告.我说得对吗?

更新:想出来,有点.阻塞连接(我使用的是)无法发送心跳,因为它阻塞了.如本期所述,heartbeat_interval参数仅用于协商与服务器的连接,但客户端实际上并不发送心跳.既然如此,那么与鼠兔保持长期连接的最佳方式是什么?即使我没有指定heartbeat_interval,服务器默认每10分钟发送一次心跳,因此连接将在30分钟后死亡......

python amqp rabbitmq pika

6
推荐指数
1
解决办法
3707
查看次数

在 Golang 结构体字段中保存类型

我正在寻找一种方法来将类型(也许是reflection.Type?)作为自定义结构中的字段。其背后的原因是,我将 JSON 数组解码为稍后构建 SQL 查询的结构,但 JSON 数组中的整数、浮点数和时间戳是相同的,尽管在查询数据库时它们是不同的。这意味着我需要在查询之前将每个值转换为其正确的类型。

我认为答案就在 Reflect 包中的某个地方,但我还没有弄清楚如何使用它。

我希望的是这样的:

type Column struct {
    name string
    dataType type
}
someColumn := Column {name: "somecol", dataType: int}
convertedVal := SomeConversionFunc("5", someColumn.dataType)
Run Code Online (Sandbox Code Playgroud)

或者,这种事情也可以工作:

type Column struct {
    name string
    dataType func()
}
someColumn := Column {name: "somecol", dataType: ConvertToInt}
convertedVal := someColumn.dataType("5")
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

reflection struct go

5
推荐指数
2
解决办法
9710
查看次数

Django安装在dist-packages中

我正在开发Amazon Linux AMI(版本2013.09).除了其他方面,我的目标是让Django运行起来.所以这就是我的工作:

  1. 使用yum安装pip(它在Python2.7/dist-packages中安装pip 7.0.3)
  2. 使用pip安装virtualenv
  3. 创建virtualenv(使用--no-site-packages)
  4. 在virtualenv中使用pip安装Django(这将在virtenv的Python目录中安装Django,在dist-packages中)

这似乎很好,直到我尝试使用manage.py.以下行:

python manage.py collectstatic --noinput -c -l > /dev/null
Run Code Online (Sandbox Code Playgroud)

调用以下错误:

OSError: [Errno 2] No such file or directory: '...my-env/lib/python2.7/site-packages/django/contrib/admin/static'
Run Code Online (Sandbox Code Playgroud)

这是事实,因为整个Django基础设施都在dist-packages中,而不是站点包.修复此依赖关系的正确方法是什么?

谢谢!

更新28.06.15 Django尝试访问site-packages的原因是其settings.py文件中的'STATIC_ROOT'定义.事情是,我几年前使用相同的设置以完全相同的方式安装了Django,并且它工作得很好.那么改变了什么?为什么pip突然转向dist-packages?

python django pip yum

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

标签 统计

python ×2

amqp ×1

django ×1

go ×1

pika ×1

pip ×1

rabbitmq ×1

reflection ×1

struct ×1

yum ×1