2016-11-11 2 views
0

Я использую pika для связи с rabbitmq.I потребляю очередь, когда получаю сообщение, я запускаю актера pykka для запуска моей логики, иногда моя логика может использовать соединение pika опубликовать message.but я обнаружил, что это будет стоить 5 секунд, чтобы создать канал в actor.Here является код:pica's SelectConnection создает стоимость канала 5 секунд при использовании в pykka

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:[email protected]: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() 

Здесь консоль:

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 

почему пищуха создать канал будет всегда стоит 5 секунд при использовании в pykka? Пожалуйста, помогите мне решить эту проблему

ответ

0

Кажется, что пищуха является на самом деле не подходит для потоков, так что нет никаких проблем с пищухой + pykka но с пищухой + нитками вообще, попробуйте использовать GeventActor или EventletActor вместо ThreadActor, и вы увидите некоторые улучшения.

От GitHub Pika'S:

Поскольку нити не подходит для любой ситуации, он не требует резьбы. Он также старается не запрещать им. То же самое касается зеленых, обратных вызовов, продолжений и генераторов. Однако это не обязательно потокобезопасность, и ваш пробег будет отличаться.

Смежные вопросы