首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当在pykka中使用时,pika的SelectConnection创建通道成本为5秒

当在pykka中使用时,pika的SelectConnection创建通道成本为5秒
EN

Stack Overflow用户
提问于 2016-11-11 15:09:06
回答 1查看 144关注 0票数 0

我使用pika和rabbitmq.I通信,我消费一个队列,当收到消息时,我启动一个pykka的actor来运行我的逻辑,有时我的逻辑可能会使用pika连接来发布message.but我发现在actor.Here中创建一个通道需要5秒,代码是:

代码语言:javascript
复制
def on_conn_open(connection):
    connection.channel(lambda ch:ch.basic_consume(on_message,"q1"))
def on_message(channel, basic_deliver, properties, body):
    channel.basic_ack(basic_deliver.delivery_tag)
    body=body.decode(encoding = 'utf8')
    print(channel,body)
    if body=="go":
        log.debug("start...")
        actor.tell({})
conn=pika.SelectConnection(pika.URLParameters('amqp://guest:guest@127.0.0.1:5672'),on_open_callback=on_conn_open,stop_ioloop_on_close=False) 

class TTT(pykka.ThreadingActor):
    def on_receive(self, message):
        conn.channel(lambda ch:log.debug("ok"))

actor=TTT.start()
conn.ioloop.start()

这里是控制台:

代码语言:javascript
复制
2016-11-11 15:04:52,292 test        : DEBUG    start...
2016-11-11 15:04:52,292 pika.connection: DEBUG    Creating channel 3
2016-11-11 15:04:52,292 pika.callback: DEBUG    Added: {'only': <Channel number=3 CLOSED conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>, 'calls': 1, 'one_shot': True, 'callback': <bound method Connection._on_channel_cleanup of <SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>, 'arguments': None}
2016-11-11 15:04:52,292 pika.callback: DEBUG    Added: {'only': None, 'one_shot': False, 'callback': <bound method Channel._on_getempty of <Channel number=3 OPENING conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>>, 'arguments': None}
2016-11-11 15:04:52,292 pika.callback: DEBUG    Added: {'only': None, 'one_shot': False, 'callback': <bound method Channel._on_cancel of <Channel number=3 OPENING conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>>, 'arguments': None}
2016-11-11 15:04:52,292 pika.callback: DEBUG    Added: {'only': None, 'one_shot': False, 'callback': <bound method Channel._on_flow of <Channel number=3 OPENING conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>>, 'arguments': None}
2016-11-11 15:04:52,292 pika.callback: DEBUG    Added: {'only': None, 'calls': 1, 'one_shot': True, 'callback': <bound method Channel._on_close of <Channel number=3 OPENING conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>>, 'arguments': None}
2016-11-11 15:04:52,292 pika.channel: DEBUG    Entering blocking state on frame <Channel.Open(['out_of_band='])>; acceptable_replies=[<class 'pika.spec.Channel.OpenOk'>]
2016-11-11 15:04:52,292 pika.channel: DEBUG    Adding on_synchronous_complete callback
2016-11-11 15:04:52,292 pika.callback: DEBUG    Added: {'only': None, 'calls': 1, 'one_shot': True, 'callback': <bound method Channel._on_synchronous_complete of <Channel number=3 OPENING conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>>, 'arguments': None}
2016-11-11 15:04:52,292 pika.channel: DEBUG    Adding passed-in callback
2016-11-11 15:04:52,292 pika.callback: DEBUG    Added: {'only': None, 'calls': 1, 'one_shot': True, 'callback': <bound method Channel._on_openok of <Channel number=3 OPENING conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>>, 'arguments': None}
2016-11-11 15:04:57,298 pika.callback: DEBUG    Processing 3:Channel.OpenOk
2016-11-11 15:04:57,298 pika.callback: DEBUG    Processing use of oneshot callback
2016-11-11 15:04:57,298 pika.callback: DEBUG    0 registered uses left
2016-11-11 15:04:57,298 pika.callback: DEBUG    Removing callback #0: {'only': None, 'calls': 0, 'one_shot': True, 'callback': <bound method Channel._on_synchronous_complete of <Channel number=3 OPENING conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>>, 'arguments': None}
2016-11-11 15:04:57,298 pika.callback: DEBUG    Processing use of oneshot callback
2016-11-11 15:04:57,298 pika.callback: DEBUG    0 registered uses left
2016-11-11 15:04:57,298 pika.callback: DEBUG    Removing callback #0: {'only': None, 'calls': 0, 'one_shot': True, 'callback': <bound method Channel._on_openok of <Channel number=3 OPENING conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>>, 'arguments': None}
2016-11-11 15:04:57,298 pika.callback: DEBUG    Calling <bound method Channel._on_synchronous_complete of <Channel number=3 OPENING conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>> for "3:Channel.OpenOk"
2016-11-11 15:04:57,298 pika.channel: DEBUG    0 blocked frames
2016-11-11 15:04:57,298 pika.callback: DEBUG    Calling <bound method Channel._on_openok of <Channel number=3 OPENING conn=<SelectConnection OPEN socket=('127.0.0.1', 2314)->('127.0.0.1', 5672) params=<URLParameters host=127.0.0.1 port=5672 virtual_host=/ ssl=False>>>> for "3:Channel.OpenOk"
2016-11-11 15:04:57,298 test        : DEBUG    ok

为什么pika在pykka中创建频道总是需要5秒的时间?请帮助我解决这个问题

EN

回答 1

Stack Overflow用户

发布于 2016-12-14 05:33:37

似乎pika并不真正适合线程,所以pika+pykka没有问题,但是对于pika+threads,尝试使用GeventActor或EventletActor而不是ThreadActor,你会看到一些改进。

来自pika的github:

因为线程并不适合每种情况,所以它不需要线程。也要注意不要禁止它们。对于greenlet、回调、延续和生成器也是如此。然而,它不一定是线程安全的,并且您的运行里程会有所不同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40542872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档