Package: aio-pika
aio-pikaA wrapper aroundaiormqfor asyncio and humans.Check out the examples and the tutorial in thedocumentation.If you are a newcomer to RabbitMQ, please start with theadopted official RabbitMQ tutorial.NoteSince version5.0.0this library doesn’t usepikaas AMQP connector.
Versions below5.0.0contains or requirespika’s source code.NoteThe version 7.0.0 has breaking API changes, see CHANGELOG.md
for migration hints.FeaturesCompletely asynchronous API.Object oriented API.Transparent auto-reconnects with complete state recovery withconnect_robust(e.g. declared queues or exchanges, consuming state and bindings).Python 3.7+ compatible.For python 3.5 users, aio-pika is available viaaio-pika<7.Transparentpublisher confirmssupport.Transactionssupport.Complete type-hints coverage.Installationpipinstallaio-pikaUsage exampleSimple consumer:importasyncioimportaio_pikaimportaio_pika.abcasyncdefmain(loop):# Connecting with the given parameters is also possible.# aio_pika.connect_robust(host="host", login="login", password="password")# You can only choose one option to create a connection, url or kw-based params.connection=awaitaio_pika.connect_robust("amqp://guest:guest@127.0.0.1/",loop=loop)asyncwithconnection:queue_name="test_queue"# Creating channelchannel:aio_pika.abc.AbstractChannel=awaitconnection.channel()# Declaring queuequeue:aio_pika.abc.AbstractQueue=awaitchannel.declare_queue(queue_name,auto_delete=True)asyncwithqueue.iterator()asqueue_iter:# Cancel consuming after __aexit__asyncformessageinqueue_iter:asyncwithmessage.process():print(message.body)ifqueue.nameinmessage.body.decode():breakif__name__=="__main__":loop=asyncio.get_event_loop()loop.run_until_complete(main(loop))loop.close()Simple publisher:importasyncioimportaio_pikaimportaio_pika.abcasyncdefmain(loop):# Explicit type annotationconnection:aio_pika.RobustConnection=awaitaio_pika.connect_robust("amqp://guest:guest@127.0.0.1/",loop=loop)routing_key="test_queue"channel:aio_pika.abc.AbstractChannel=awaitconnection.channel()awaitchannel.default_exchange.publish(aio_pika.Message(body='Hello{}'.format(routing_key).encode()),routing_key=routing_key)awaitconnection.close()if__name__=="__main__":loop=asyncio.get_event_loop()loop.run_until_complete(main(loop))loop.close()Get single message example:importasynciofromaio_pikaimportconnect_robust,Messageasyncdefmain(loop):connection=awaitconnect_robust("amqp://guest:guest@127.0.0.1/",loop=loop)queue_name="test_queue"routing_key="test_queue"# Creating channelchannel=awaitconnection.channel()# Declaring exchangeexchange=awaitchannel.declare_exchange('direct',auto_delete=True)# Declaring queuequeue=awaitchannel.declare_queue(queue_name,auto_delete=True)# Binding queueawaitqueue.bind(exchange,routing_key)awaitexchange.publish(Message(bytes('Hello','utf-8'),content_type='text/plain',headers={'foo':'bar'}),routing_key)# Receiving messageincoming_message=awaitqueue.get(timeout=5)# Confirm messageawaitincoming_message.ack()awaitqueue.unbind(exchange,routing_key)awaitqueue.delete()awaitconnection.close()if__name__=="__main__":loop=asyncio.get_event_loop()loop.run_until_complete(main(loop))There are more examples and the RabbitMQ tutorial in thedocumentation.See alsoaiormqaiormqis a pure python AMQP client library. It is under the hood ofaio-pikaand might to be used when you really loving works with the protocol low level.
Following examples demonstrates the user API.Simple consumer:importasyncioimportaiormqasyncdefon_message(message):"""
    on_message doesn't necessarily have to be defined as async.
    Here it is to show that it's possible.
    """print(f" [x] Received message{message!r}")print(f"Message body is:{message.body!r}")print("Before sleep!")awaitasyncio.sleep(5)# Represents async I/O operationsprint("After sleep!")asyncdefmain():# Perform connectionconnection=awaitaiormq.connect("amqp://guest:guest@localhost/")# Creating a channelchannel=awaitconnection.channel()# Declaring queuedeclare_ok=awaitchannel.queue_declare('helo')consume_ok=awaitchannel.basic_consume(declare_ok.queue,on_message,no_ack=True)loop=asyncio.get_event_loop()loop.run_until_complete(main())loop.run_forever()Simple publisher:importasynciofromtypingimportOptionalimportaiormqfromaiormq.abcimportDeliveredMessageMESSAGE:Optional[DeliveredMessage]=Noneasyncdefmain():globalMESSAGEbody=b'Hello World!'# Perform connectionconnection=awaitaiormq.connect("amqp://guest:guest@localhost//")# Creating a channelchannel=awaitconnection.channel()declare_ok=awaitchannel.queue_declare("hello",auto_delete=True)# Sending the messageawaitchannel.basic_publish(body,routing_key='hello')print(f" [x] Sent{body}")MESSAGE=awaitchannel.basic_get(declare_ok.queue)print(f" [x] Received message from{declare_ok.queue!r}")loop=asyncio.get_event_loop()loop.run_until_complete(main())assertMESSAGEisnotNoneassertMESSAGE.routing_key=="hello"assertMESSAGE.body==b'Hello World!'Thepatioand thepatio-rabbitmqPATIOis an acronym for Python Asynchronous Tasks for AsyncIO - an easily extensible library, for distributed task execution, like celery, only targeting asyncio as the main design approach.patio-rabbitmqprovides you with the ability to useRPC over RabbitMQservices with extremely simple implementation:frompatioimportRegistry,ThreadPoolExecutorfrompatio_rabbitmqimportRabbitMQBrokerrpc=Registry(project="patio-rabbitmq",auto_naming=False)@rpc("sum")defsum(*args):returnsum(args)asyncdefmain():asyncwithThreadPoolExecutor(rpc,max_workers=16)asexecutor:asyncwithRabbitMQBroker(executor,amqp_url="amqp://guest:guest@localhost/",)asbroker:awaitbroker.join()And the caller side might be written like this:importasynciofrompatioimportNullExecutor,Registryfrompatio_rabbitmqimportRabbitMQBrokerasyncdefmain():asyncwithNullExecutor(Registry(project="patio-rabbitmq"))asexecutor:asyncwithRabbitMQBroker(executor,amqp_url="amqp://guest:guest@localhost/",)asbroker:print(awaitasyncio.gather(*[broker.call("mul",i,i,timeout=1)foriinrange(10)]))Propan:fire:Propanis a powerful and easy-to-use Python framework for building event-driven applications that interact with any MQ Broker.If you need no deep dive intoRabbitMQdetails, you can use more high-levelPropaninterfaces:frompropanimportPropanApp,RabbitBrokerbroker=RabbitBroker("amqp://guest:guest@localhost:5672/")app=PropanApp(broker)@broker.handle("user")asyncdefuser_created(user_id:int):assertisinstance(user_id,int)returnf"user-{user_id}: created"@app.after_startupasyncdefpub_smth():assert(awaitbroker.publish(1,"user",callback=True))=="user-1: created"Also,Propanvalidates messages bypydantic, generates your projectAsyncAPIspec, tests application locally, RPC calls, and more.In fact, it is a high-level wrapper on top ofaio-pika, so you can use both of these libraries’ advantages at the same time.python-socketioSocket.IOis a transport protocol that enables real-time bidirectional event-based communication between clients (typically, though not always, web browsers) and a server. This package provides Python implementations of both, each with standard and asyncio variants.Also this package is suitable for building messaging services overRabbitMQviaaio-pikaadapter:importsocketiofromaiohttpimportwebsio=socketio.AsyncServer(client_manager=socketio.AsyncAioPikaManager())app=web.Application()sio.attach(app)@sio.eventasyncdefchat_message(sid,data):print("message ",data)if__name__=='__main__':web.run_app(app)And a client is able to callchat_messagethe following way:importasyncioimportsocketiosio=socketio.AsyncClient()asyncdefmain():awaitsio.connect('http://localhost:8080')awaitsio.emit('chat_message',{'response':'my response'})if__name__=='__main__':asyncio.run(main())Thetaskiqand thetaskiq-aio-pikaTaskiqis an asynchronous distributed task queue for python. The project takes inspiration from big projects such as Celery and Dramatiq. But taskiq can send and run both the sync and async functions.The library provides you withaio-pikabroker for running tasks too.fromtaskiq_aio_pikaimportAioPikaBrokerbroker=AioPikaBroker()@broker.taskasyncdeftest()->None:print("nothing")asyncdefmain():awaitbroker.startup()awaittest.kiq()RasaWith over 25 million downloads, Rasa Open Source is the most popular open source framework for building chat and voice-based AI assistants.WithRasa, you can build contextual assistants on:Facebook MessengerSlackGoogle HangoutsWebex TeamsMicrosoft Bot FrameworkRocket.ChatMattermostTelegramTwilioYour own custom conversational channels or voice assistants as:Alexa SkillsGoogle Home ActionsRasahelps you build contextual assistants capable of having layered conversations with lots of back-and-forth. In order for a human to have a meaningful exchange with a contextual assistant, the assistant needs to be able to use context to build on things that were previously discussed –Rasaenables you to build assistants that can do this in a scalable way.And it also usesaio-pikato interact withRabbitMQdeep inside!VersioningThis software followsSemantic VersioningFor contributorsSetting up development environmentClone the project:gitclonehttps://github.com/mosquito/aio-pika.gitcdaio-pikaCreate a new virtualenv foraio-pika:python3-mvenvenvsourceenv/bin/activateInstall all requirements foraio-pika:pipinstall-e'.[develop]'Running TestsNOTE: In order to run the tests locally you need to run a RabbitMQ instance with default user/password (guest/guest) and port (5672).The Makefile provides a command to run an appropriate RabbitMQ Docker image:makerabbitmqTo test just run:maketestEditing DocumentationTo iterate quickly on the documentation live in your browser, try:nox-sdocs--serveCreating Pull RequestsPlease feel free to create pull requests, but you should describe your use cases and add some examples.Changes should follow a few simple rules:When your changes break the public API, you must increase the major version.When your changes are safe for public API (e.g. added an argument with default value)You have to add test cases (seetests/folder)You must add docstringsFeel free to add yourself to“thank’s to” section