This is an automated email from the ASF dual-hosted git repository.

lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git


The following commit(s) were added to refs/heads/main by this push:
     new 56734eb2c19 Add Python examples to producer and consumer documentation 
(#1058)
56734eb2c19 is described below

commit 56734eb2c1994e073000d7242664a33a395c014d
Author: Sergii Zhevzhyk <[email protected]>
AuthorDate: Mon Dec 1 09:11:35 2025 +0100

    Add Python examples to producer and consumer documentation (#1058)
    
    Add Python code examples to generic producer and consumer documentation
    pages to demonstrate Python client support. Examples include producer
    creation, message publishing, message configuration, subscription types,
    message receiving, and acknowledgment.
    
    Co-authored-by: Sergii Zhevzhyk <[email protected]>
---
 docs/client-libraries-consumers.md                 | 219 +++++++++++++++++++--
 docs/client-libraries-producers.md                 |  64 +++++-
 .../version-3.0.x/client-libraries-consumers.md    | 219 +++++++++++++++++++--
 .../version-3.0.x/client-libraries-producers.md    |  33 +++-
 .../version-4.0.x/client-libraries-consumers.md    | 219 +++++++++++++++++++--
 .../version-4.0.x/client-libraries-producers.md    |  64 +++++-
 .../version-4.1.x/client-libraries-consumers.md    | 219 +++++++++++++++++++--
 .../version-4.1.x/client-libraries-producers.md    |  64 +++++-
 8 files changed, 1015 insertions(+), 86 deletions(-)

diff --git a/docs/client-libraries-consumers.md 
b/docs/client-libraries-consumers.md
index 6795fa95f39..f6cae3b4b24 100644
--- a/docs/client-libraries-consumers.md
+++ b/docs/client-libraries-consumers.md
@@ -25,7 +25,7 @@ To better describe their differences, assume you have a topic 
named "my-topic",
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -44,6 +44,24 @@ 
producer.newMessage().key("key-3").value("message-3-1").send();
 producer.newMessage().key("key-3").value("message-3-2").send();
 producer.newMessage().key("key-4").value("message-4-1").send();
 producer.newMessage().key("key-4").value("message-4-2").send();
+```
+
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic', batching_enabled=False)
+# 3 messages with "key-1", 3 messages with "key-2", 2 messages with "key-3" 
and 2 messages with "key-4"
+producer.send(b'message-1-1', partition_key='key-1')
+producer.send(b'message-1-2', partition_key='key-1')
+producer.send(b'message-1-3', partition_key='key-1')
+producer.send(b'message-2-1', partition_key='key-2')
+producer.send(b'message-2-2', partition_key='key-2')
+producer.send(b'message-2-3', partition_key='key-2')
+producer.send(b'message-3-1', partition_key='key-3')
+producer.send(b'message-3-2', partition_key='key-3')
+producer.send(b'message-4-1', partition_key='key-4')
+producer.send(b'message-4-2', partition_key='key-4')
 ```
 
   </TabItem>
@@ -57,7 +75,7 @@ Create a new consumer and subscribe with the `Exclusive` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -68,6 +86,14 @@ Consumer consumer = client.newConsumer()
         .subscribe()
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe('my-topic', 'my-subscription',
+                             consumer_type=pulsar.ConsumerType.Exclusive)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -87,7 +113,7 @@ Create new consumers and subscribe with the `Failover` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -105,6 +131,16 @@ Consumer consumer2 = client.newConsumer()
 //consumer1 receives 5 messages and then crashes, consumer2 takes over as an  
active consumer.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Failover)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Failover)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -144,7 +180,7 @@ Create new consumers and subscribe with `Shared` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -162,6 +198,16 @@ Consumer consumer2 = client.newConsumer()
 //Both consumer1 and consumer2 are active consumers.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Shared)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Shared)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -197,7 +243,7 @@ This is a new subscription type since 2.4.0 release. Create 
new consumers and su
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -215,6 +261,16 @@ Consumer consumer2 = client.newConsumer()
 //Both consumer1 and consumer2 are active consumers.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.KeyShared)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.KeyShared)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -246,7 +302,7 @@ If batching is enabled at the producer side, messages with 
different keys are ad
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -256,6 +312,14 @@ Producer producer = client.newProducer()
         .create();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic',
+                                   batching_type=pulsar.BatchingType.KeyBased)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -265,7 +329,7 @@ Or the producer can disable batching.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -275,6 +339,13 @@ Producer producer = client.newProducer()
         .create();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic', batching_enabled=False)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -430,7 +501,7 @@ This example shows how a consumer unsubscribes from a topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -446,6 +517,14 @@ This example shows how a consumer unsubscribes from a 
topic.
    ```
 
   </TabItem>
+
+<TabItem value="Python">
+
+   ```python
+   consumer.unsubscribe()
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -462,7 +541,7 @@ This example shows how a consumer receives messages from a 
topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}, {"label":"C#","value":"C#"}]}>
+  values={[{"label":"Java","value":"Java"}, {"label":"C#","value":"C#"}, 
{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -481,6 +560,14 @@ This example shows how a consumer receives messages from a 
topic.
    ```
 
  </TabItem>
+
+<TabItem value="Python">
+
+   ```python
+   msg = consumer.receive()
+   ```
+
+ </TabItem>
 </Tabs>
 ````
 
@@ -489,7 +576,7 @@ This example shows how a consumer receives messages from a 
topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}, {"label":"Go","value":"Go"}]}>
+  values={[{"label":"Java","value":"Java"}, {"label":"Go","value":"Go"}, 
{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -534,6 +621,18 @@ This example shows how a consumer receives messages from a 
topic.
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+   ```python
+   # Receive with 10 second timeout (timeout in milliseconds)
+   try:
+       msg = consumer.receive(timeout_millis=10000)
+   except Exception:
+       print("No message received within timeout period")
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -546,7 +645,7 @@ The following is an example.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -556,6 +655,22 @@ The following is an example.
    Async receive operations return a 
[Message](/api/client/org/apache/pulsar/client/api/Message) wrapped inside of a 
[`CompletableFuture`](http://www.baeldung.com/java-completablefuture).
 
  </TabItem>
+ <TabItem value="Python">
+
+   ```python
+   import asyncio
+
+   async def receive_messages():
+       msg = await consumer.receive_async()
+       return msg
+
+   # Use in async context
+   msg = asyncio.run(receive_messages())
+   ```
+
+   Async receive operations in Python use asyncio and return a coroutine that 
resolves to a Message.
+
+ </TabItem>
 </Tabs>
 ````
 
@@ -568,7 +683,7 @@ The following is an example.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -577,6 +692,17 @@ for (Object message : messages) {
   // do something
 }
 consumer.acknowledge(messages)
+```
+
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+messages = consumer.batch_receive()
+for msg in messages:
+    # do something
+    pass
+consumer.acknowledge(messages)
 ```
 
   </TabItem>
@@ -621,7 +747,7 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   ```java
@@ -636,6 +762,13 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
   await consumer.Acknowledge(message);
   ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+  ```python
+  consumer.acknowledge(msg)
+  ```
+
   </TabItem>
 </Tabs>
 ````
@@ -645,7 +778,7 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   ```java
@@ -659,6 +792,13 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
   await consumer.AcknowledgeCumulative(message);
   ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+  ```python
+  consumer.acknowledge_cumulative(msg)
+  ```
+
   </TabItem>
 </Tabs>
 ````
@@ -670,7 +810,7 @@ The `RedeliveryBackoff` introduces a redelivery backoff 
mechanism. You can achie
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -684,6 +824,17 @@ Consumer consumer =  client.newConsumer()
         .subscribe();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe(
+    'my-topic',
+    'my-subscription',
+    negative_ack_redelivery_delay_ms=1000
+)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -695,7 +846,7 @@ The `RedeliveryBackoff` introduces a redelivery backoff 
mechanism. You can redel
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -711,6 +862,17 @@ Consumer consumer =  client.newConsumer()
         .subscribe();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe(
+    'my-topic',
+    'my-subscription',
+    unacked_messages_timeout_ms=10000
+)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -793,7 +955,7 @@ You can avoid running a loop by blocking calls with an 
event-based style by usin
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -910,6 +1072,29 @@ func main() {
         consumer.Ack(msg)
     }
 }
+```
+
+  </TabItem>
+
+  <TabItem value="Python">
+
+```python
+def my_listener(consumer, message):
+    try:
+        print("Received message: '{}' id='{}'".format(
+            message.data(),
+            message.message_id()
+        ))
+        consumer.acknowledge(message)
+    except Exception as e:
+        consumer.negative_acknowledge(message)
+        print("Error processing message:", e)
+
+consumer = client.subscribe(
+    'persistent://my-property/my-ns/my-topic',
+    'my-subscription',
+    message_listener=my_listener
+)
 ```
 
   </TabItem>
diff --git a/docs/client-libraries-producers.md 
b/docs/client-libraries-producers.md
index 98e6fa0fb70..5d7f1078600 100644
--- a/docs/client-libraries-producers.md
+++ b/docs/client-libraries-producers.md
@@ -19,7 +19,7 @@ This example shows how to create a producer.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Python","value":"Python"}]}>
 
   <TabItem value="Java">
 
@@ -50,6 +50,14 @@ This example shows how to create a producer.
   ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  ```python
+  producer = client.create_producer('my-topic')
+  ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -64,7 +72,7 @@ This example shows how to publish messages using producers. 
The publish operatio
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Node.js","value":"Node.js"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Node.js","value":"Node.js"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   Publish messages synchronously:
@@ -183,6 +191,14 @@ await producer.Send(data);
 ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  ```python
+  producer.send('Hello World'.encode('utf-8'))
+  ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -193,7 +209,7 @@ You can set various properties of Pulsar's messages. The 
values of these propert
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 
 <TabItem value="Java">
 
@@ -260,6 +276,16 @@ You can set various properties of Pulsar's messages. The 
values of these propert
                               .Send(data);
   ```
 
+</TabItem>
+
+<TabItem value="Python">
+
+  ```python
+  producer.send('content'.encode('utf-8'),
+                properties={'my-key': 'my-value', 'my-other-key': 
'my-other-value'},
+                event_timestamp=int(time.time() * 1000))
+  ```
+
 </TabItem>
 </Tabs>
 ````
@@ -279,7 +305,7 @@ The following is an example:
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
   <TabItem value="Java">
 
    ```java
@@ -320,6 +346,17 @@ The following is an example:
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+   ```python
+    producer = client.create_producer(
+        'my-topic',
+        message_routing_mode=PartitionsRoutingMode.SinglePartition
+    )
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -328,7 +365,7 @@ The following is an example:
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 To use a custom message router, you need to provide an implementation of the 
[MessageRouter](/api/client/org/apache/pulsar/client/api/MessageRouter) 
interface, which has just one `choosePartition` method:
@@ -416,6 +453,23 @@ result = producer.send(msg);
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  In the Python client, you can configure a customized message router by 
passing a function.
+   ```python
+    def custom_message_router(msg: pulsar.Message, num_partitions: int):
+        # always push msg to partition 10
+        return 10
+
+    producer = client.create_producer(
+        'my-topic',
+        message_router=custom_message_router
+    )
+    producer.send(b'content')
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
diff --git a/versioned_docs/version-3.0.x/client-libraries-consumers.md 
b/versioned_docs/version-3.0.x/client-libraries-consumers.md
index 28cfb4c0d5a..39296cbdee1 100644
--- a/versioned_docs/version-3.0.x/client-libraries-consumers.md
+++ b/versioned_docs/version-3.0.x/client-libraries-consumers.md
@@ -24,7 +24,7 @@ To better describe their differences, assume you have a topic 
named "my-topic",
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -43,6 +43,24 @@ 
producer.newMessage().key("key-3").value("message-3-1").send();
 producer.newMessage().key("key-3").value("message-3-2").send();
 producer.newMessage().key("key-4").value("message-4-1").send();
 producer.newMessage().key("key-4").value("message-4-2").send();
+```
+
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic', batching_enabled=False)
+# 3 messages with "key-1", 3 messages with "key-2", 2 messages with "key-3" 
and 2 messages with "key-4"
+producer.send(b'message-1-1', partition_key='key-1')
+producer.send(b'message-1-2', partition_key='key-1')
+producer.send(b'message-1-3', partition_key='key-1')
+producer.send(b'message-2-1', partition_key='key-2')
+producer.send(b'message-2-2', partition_key='key-2')
+producer.send(b'message-2-3', partition_key='key-2')
+producer.send(b'message-3-1', partition_key='key-3')
+producer.send(b'message-3-2', partition_key='key-3')
+producer.send(b'message-4-1', partition_key='key-4')
+producer.send(b'message-4-2', partition_key='key-4')
 ```
 
   </TabItem>
@@ -56,7 +74,7 @@ Create a new consumer and subscribe with the `Exclusive` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -67,6 +85,14 @@ Consumer consumer = client.newConsumer()
         .subscribe()
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe('my-topic', 'my-subscription',
+                             consumer_type=pulsar.ConsumerType.Exclusive)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -86,7 +112,7 @@ Create new consumers and subscribe with the `Failover` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -104,6 +130,16 @@ Consumer consumer2 = client.newConsumer()
 //consumer1 receives 5 messages and then crashes, consumer2 takes over as an  
active consumer.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Failover)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Failover)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -143,7 +179,7 @@ Create new consumers and subscribe with `Shared` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -161,6 +197,16 @@ Consumer consumer2 = client.newConsumer()
 //Both consumer1 and consumer2 are active consumers.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Shared)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Shared)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -196,7 +242,7 @@ This is a new subscription type since 2.4.0 release. Create 
new consumers and su
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -214,6 +260,16 @@ Consumer consumer2 = client.newConsumer()
 //Both consumer1 and consumer2 are active consumers.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.KeyShared)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.KeyShared)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -245,7 +301,7 @@ If batching is enabled at the producer side, messages with 
different keys are ad
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -255,6 +311,14 @@ Producer producer = client.newProducer()
         .create();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic',
+                                   batching_type=pulsar.BatchingType.KeyBased)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -264,7 +328,7 @@ Or the producer can disable batching.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -274,6 +338,13 @@ Producer producer = client.newProducer()
         .create();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic', batching_enabled=False)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -429,7 +500,7 @@ This example shows how a consumer unsubscribes from a topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -445,6 +516,14 @@ This example shows how a consumer unsubscribes from a 
topic.
    ```
 
   </TabItem>
+
+<TabItem value="Python">
+
+   ```python
+   consumer.unsubscribe()
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -461,7 +540,7 @@ This example shows how a consumer receives messages from a 
topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}, {"label":"C#","value":"C#"}]}>
+  values={[{"label":"Java","value":"Java"}, {"label":"C#","value":"C#"}, 
{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -480,6 +559,14 @@ This example shows how a consumer receives messages from a 
topic.
    ```
 
  </TabItem>
+
+<TabItem value="Python">
+
+   ```python
+   msg = consumer.receive()
+   ```
+
+ </TabItem>
 </Tabs>
 ````
 
@@ -488,7 +575,7 @@ This example shows how a consumer receives messages from a 
topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}, {"label":"Go","value":"Go"}]}>
+  values={[{"label":"Java","value":"Java"}, {"label":"Go","value":"Go"}, 
{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -533,6 +620,18 @@ This example shows how a consumer receives messages from a 
topic.
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+   ```python
+   # Receive with 10 second timeout (timeout in milliseconds)
+   try:
+       msg = consumer.receive(timeout_millis=10000)
+   except Exception:
+       print("No message received within timeout period")
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -545,7 +644,7 @@ The following is an example.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -555,6 +654,22 @@ The following is an example.
    Async receive operations return a 
[Message](/api/client/org/apache/pulsar/client/api/Message) wrapped inside of a 
[`CompletableFuture`](http://www.baeldung.com/java-completablefuture).
 
  </TabItem>
+ <TabItem value="Python">
+
+   ```python
+   import asyncio
+
+   async def receive_messages():
+       msg = await consumer.receive_async()
+       return msg
+
+   # Use in async context
+   msg = asyncio.run(receive_messages())
+   ```
+
+   Async receive operations in Python use asyncio and return a coroutine that 
resolves to a Message.
+
+ </TabItem>
 </Tabs>
 ````
 
@@ -567,7 +682,7 @@ The following is an example.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -576,6 +691,17 @@ for (Object message : messages) {
   // do something
 }
 consumer.acknowledge(messages)
+```
+
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+messages = consumer.batch_receive()
+for msg in messages:
+    # do something
+    pass
+consumer.acknowledge(messages)
 ```
 
   </TabItem>
@@ -620,7 +746,7 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   ```java
@@ -635,6 +761,13 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
   await consumer.Acknowledge(message);
   ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+  ```python
+  consumer.acknowledge(msg)
+  ```
+
   </TabItem>
 </Tabs>
 ````
@@ -644,7 +777,7 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   ```java
@@ -658,6 +791,13 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
   await consumer.AcknowledgeCumulative(message);
   ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+  ```python
+  consumer.acknowledge_cumulative(msg)
+  ```
+
   </TabItem>
 </Tabs>
 ````
@@ -669,7 +809,7 @@ The `RedeliveryBackoff` introduces a redelivery backoff 
mechanism. You can achie
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -683,6 +823,17 @@ Consumer consumer =  client.newConsumer()
         .subscribe();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe(
+    'my-topic',
+    'my-subscription',
+    negative_ack_redelivery_delay_ms=1000
+)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -694,7 +845,7 @@ The `RedeliveryBackoff` introduces a redelivery backoff 
mechanism. You can redel
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -710,6 +861,17 @@ Consumer consumer =  client.newConsumer()
         .subscribe();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe(
+    'my-topic',
+    'my-subscription',
+    unacked_messages_timeout_ms=10000
+)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -792,7 +954,7 @@ You can avoid running a loop by blocking calls with an 
event-based style by usin
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -909,6 +1071,29 @@ func main() {
         consumer.Ack(msg)
     }
 }
+```
+
+  </TabItem>
+
+  <TabItem value="Python">
+
+```python
+def my_listener(consumer, message):
+    try:
+        print("Received message: '{}' id='{}'".format(
+            message.data(),
+            message.message_id()
+        ))
+        consumer.acknowledge(message)
+    except Exception as e:
+        consumer.negative_acknowledge(message)
+        print("Error processing message:", e)
+
+consumer = client.subscribe(
+    'persistent://my-property/my-ns/my-topic',
+    'my-subscription',
+    message_listener=my_listener
+)
 ```
 
   </TabItem>
diff --git a/versioned_docs/version-3.0.x/client-libraries-producers.md 
b/versioned_docs/version-3.0.x/client-libraries-producers.md
index 4a42e1ecbb7..f7deadf494b 100644
--- a/versioned_docs/version-3.0.x/client-libraries-producers.md
+++ b/versioned_docs/version-3.0.x/client-libraries-producers.md
@@ -18,7 +18,7 @@ This example shows how to create a producer.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Python","value":"Python"}]}>
 
   <TabItem value="Java">
 
@@ -38,6 +38,14 @@ Producer<String> producer = 
pulsarClient.newProducer(Schema.STRING)
   ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  ```python
+  producer = client.create_producer('my-topic')
+  ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -48,7 +56,7 @@ This example shows how to send messages using producers.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Node.js","value":"Node.js"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Node.js","value":"Node.js"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -175,6 +183,14 @@ await producer.Send(data);
 ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  ```python
+  producer.send('Hello World'.encode('utf-8'))
+  ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -277,7 +293,7 @@ The following is an example:
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
   <TabItem value="Java">
 
    ```java
@@ -369,6 +385,17 @@ The following is an example:
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+   ```python
+    producer = client.create_producer(
+        'my-topic',
+        message_routing_mode=PartitionsRoutingMode.SinglePartition
+    )
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
diff --git a/versioned_docs/version-4.0.x/client-libraries-consumers.md 
b/versioned_docs/version-4.0.x/client-libraries-consumers.md
index 6795fa95f39..f6cae3b4b24 100644
--- a/versioned_docs/version-4.0.x/client-libraries-consumers.md
+++ b/versioned_docs/version-4.0.x/client-libraries-consumers.md
@@ -25,7 +25,7 @@ To better describe their differences, assume you have a topic 
named "my-topic",
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -44,6 +44,24 @@ 
producer.newMessage().key("key-3").value("message-3-1").send();
 producer.newMessage().key("key-3").value("message-3-2").send();
 producer.newMessage().key("key-4").value("message-4-1").send();
 producer.newMessage().key("key-4").value("message-4-2").send();
+```
+
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic', batching_enabled=False)
+# 3 messages with "key-1", 3 messages with "key-2", 2 messages with "key-3" 
and 2 messages with "key-4"
+producer.send(b'message-1-1', partition_key='key-1')
+producer.send(b'message-1-2', partition_key='key-1')
+producer.send(b'message-1-3', partition_key='key-1')
+producer.send(b'message-2-1', partition_key='key-2')
+producer.send(b'message-2-2', partition_key='key-2')
+producer.send(b'message-2-3', partition_key='key-2')
+producer.send(b'message-3-1', partition_key='key-3')
+producer.send(b'message-3-2', partition_key='key-3')
+producer.send(b'message-4-1', partition_key='key-4')
+producer.send(b'message-4-2', partition_key='key-4')
 ```
 
   </TabItem>
@@ -57,7 +75,7 @@ Create a new consumer and subscribe with the `Exclusive` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -68,6 +86,14 @@ Consumer consumer = client.newConsumer()
         .subscribe()
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe('my-topic', 'my-subscription',
+                             consumer_type=pulsar.ConsumerType.Exclusive)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -87,7 +113,7 @@ Create new consumers and subscribe with the `Failover` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -105,6 +131,16 @@ Consumer consumer2 = client.newConsumer()
 //consumer1 receives 5 messages and then crashes, consumer2 takes over as an  
active consumer.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Failover)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Failover)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -144,7 +180,7 @@ Create new consumers and subscribe with `Shared` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -162,6 +198,16 @@ Consumer consumer2 = client.newConsumer()
 //Both consumer1 and consumer2 are active consumers.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Shared)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Shared)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -197,7 +243,7 @@ This is a new subscription type since 2.4.0 release. Create 
new consumers and su
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -215,6 +261,16 @@ Consumer consumer2 = client.newConsumer()
 //Both consumer1 and consumer2 are active consumers.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.KeyShared)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.KeyShared)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -246,7 +302,7 @@ If batching is enabled at the producer side, messages with 
different keys are ad
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -256,6 +312,14 @@ Producer producer = client.newProducer()
         .create();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic',
+                                   batching_type=pulsar.BatchingType.KeyBased)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -265,7 +329,7 @@ Or the producer can disable batching.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -275,6 +339,13 @@ Producer producer = client.newProducer()
         .create();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic', batching_enabled=False)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -430,7 +501,7 @@ This example shows how a consumer unsubscribes from a topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -446,6 +517,14 @@ This example shows how a consumer unsubscribes from a 
topic.
    ```
 
   </TabItem>
+
+<TabItem value="Python">
+
+   ```python
+   consumer.unsubscribe()
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -462,7 +541,7 @@ This example shows how a consumer receives messages from a 
topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}, {"label":"C#","value":"C#"}]}>
+  values={[{"label":"Java","value":"Java"}, {"label":"C#","value":"C#"}, 
{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -481,6 +560,14 @@ This example shows how a consumer receives messages from a 
topic.
    ```
 
  </TabItem>
+
+<TabItem value="Python">
+
+   ```python
+   msg = consumer.receive()
+   ```
+
+ </TabItem>
 </Tabs>
 ````
 
@@ -489,7 +576,7 @@ This example shows how a consumer receives messages from a 
topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}, {"label":"Go","value":"Go"}]}>
+  values={[{"label":"Java","value":"Java"}, {"label":"Go","value":"Go"}, 
{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -534,6 +621,18 @@ This example shows how a consumer receives messages from a 
topic.
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+   ```python
+   # Receive with 10 second timeout (timeout in milliseconds)
+   try:
+       msg = consumer.receive(timeout_millis=10000)
+   except Exception:
+       print("No message received within timeout period")
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -546,7 +645,7 @@ The following is an example.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -556,6 +655,22 @@ The following is an example.
    Async receive operations return a 
[Message](/api/client/org/apache/pulsar/client/api/Message) wrapped inside of a 
[`CompletableFuture`](http://www.baeldung.com/java-completablefuture).
 
  </TabItem>
+ <TabItem value="Python">
+
+   ```python
+   import asyncio
+
+   async def receive_messages():
+       msg = await consumer.receive_async()
+       return msg
+
+   # Use in async context
+   msg = asyncio.run(receive_messages())
+   ```
+
+   Async receive operations in Python use asyncio and return a coroutine that 
resolves to a Message.
+
+ </TabItem>
 </Tabs>
 ````
 
@@ -568,7 +683,7 @@ The following is an example.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -577,6 +692,17 @@ for (Object message : messages) {
   // do something
 }
 consumer.acknowledge(messages)
+```
+
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+messages = consumer.batch_receive()
+for msg in messages:
+    # do something
+    pass
+consumer.acknowledge(messages)
 ```
 
   </TabItem>
@@ -621,7 +747,7 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   ```java
@@ -636,6 +762,13 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
   await consumer.Acknowledge(message);
   ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+  ```python
+  consumer.acknowledge(msg)
+  ```
+
   </TabItem>
 </Tabs>
 ````
@@ -645,7 +778,7 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   ```java
@@ -659,6 +792,13 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
   await consumer.AcknowledgeCumulative(message);
   ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+  ```python
+  consumer.acknowledge_cumulative(msg)
+  ```
+
   </TabItem>
 </Tabs>
 ````
@@ -670,7 +810,7 @@ The `RedeliveryBackoff` introduces a redelivery backoff 
mechanism. You can achie
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -684,6 +824,17 @@ Consumer consumer =  client.newConsumer()
         .subscribe();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe(
+    'my-topic',
+    'my-subscription',
+    negative_ack_redelivery_delay_ms=1000
+)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -695,7 +846,7 @@ The `RedeliveryBackoff` introduces a redelivery backoff 
mechanism. You can redel
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -711,6 +862,17 @@ Consumer consumer =  client.newConsumer()
         .subscribe();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe(
+    'my-topic',
+    'my-subscription',
+    unacked_messages_timeout_ms=10000
+)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -793,7 +955,7 @@ You can avoid running a loop by blocking calls with an 
event-based style by usin
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -910,6 +1072,29 @@ func main() {
         consumer.Ack(msg)
     }
 }
+```
+
+  </TabItem>
+
+  <TabItem value="Python">
+
+```python
+def my_listener(consumer, message):
+    try:
+        print("Received message: '{}' id='{}'".format(
+            message.data(),
+            message.message_id()
+        ))
+        consumer.acknowledge(message)
+    except Exception as e:
+        consumer.negative_acknowledge(message)
+        print("Error processing message:", e)
+
+consumer = client.subscribe(
+    'persistent://my-property/my-ns/my-topic',
+    'my-subscription',
+    message_listener=my_listener
+)
 ```
 
   </TabItem>
diff --git a/versioned_docs/version-4.0.x/client-libraries-producers.md 
b/versioned_docs/version-4.0.x/client-libraries-producers.md
index 98e6fa0fb70..5d7f1078600 100644
--- a/versioned_docs/version-4.0.x/client-libraries-producers.md
+++ b/versioned_docs/version-4.0.x/client-libraries-producers.md
@@ -19,7 +19,7 @@ This example shows how to create a producer.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Python","value":"Python"}]}>
 
   <TabItem value="Java">
 
@@ -50,6 +50,14 @@ This example shows how to create a producer.
   ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  ```python
+  producer = client.create_producer('my-topic')
+  ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -64,7 +72,7 @@ This example shows how to publish messages using producers. 
The publish operatio
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Node.js","value":"Node.js"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Node.js","value":"Node.js"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   Publish messages synchronously:
@@ -183,6 +191,14 @@ await producer.Send(data);
 ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  ```python
+  producer.send('Hello World'.encode('utf-8'))
+  ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -193,7 +209,7 @@ You can set various properties of Pulsar's messages. The 
values of these propert
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 
 <TabItem value="Java">
 
@@ -260,6 +276,16 @@ You can set various properties of Pulsar's messages. The 
values of these propert
                               .Send(data);
   ```
 
+</TabItem>
+
+<TabItem value="Python">
+
+  ```python
+  producer.send('content'.encode('utf-8'),
+                properties={'my-key': 'my-value', 'my-other-key': 
'my-other-value'},
+                event_timestamp=int(time.time() * 1000))
+  ```
+
 </TabItem>
 </Tabs>
 ````
@@ -279,7 +305,7 @@ The following is an example:
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
   <TabItem value="Java">
 
    ```java
@@ -320,6 +346,17 @@ The following is an example:
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+   ```python
+    producer = client.create_producer(
+        'my-topic',
+        message_routing_mode=PartitionsRoutingMode.SinglePartition
+    )
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -328,7 +365,7 @@ The following is an example:
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 To use a custom message router, you need to provide an implementation of the 
[MessageRouter](/api/client/org/apache/pulsar/client/api/MessageRouter) 
interface, which has just one `choosePartition` method:
@@ -416,6 +453,23 @@ result = producer.send(msg);
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  In the Python client, you can configure a customized message router by 
passing a function.
+   ```python
+    def custom_message_router(msg: pulsar.Message, num_partitions: int):
+        # always push msg to partition 10
+        return 10
+
+    producer = client.create_producer(
+        'my-topic',
+        message_router=custom_message_router
+    )
+    producer.send(b'content')
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
diff --git a/versioned_docs/version-4.1.x/client-libraries-consumers.md 
b/versioned_docs/version-4.1.x/client-libraries-consumers.md
index 6795fa95f39..f6cae3b4b24 100644
--- a/versioned_docs/version-4.1.x/client-libraries-consumers.md
+++ b/versioned_docs/version-4.1.x/client-libraries-consumers.md
@@ -25,7 +25,7 @@ To better describe their differences, assume you have a topic 
named "my-topic",
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -44,6 +44,24 @@ 
producer.newMessage().key("key-3").value("message-3-1").send();
 producer.newMessage().key("key-3").value("message-3-2").send();
 producer.newMessage().key("key-4").value("message-4-1").send();
 producer.newMessage().key("key-4").value("message-4-2").send();
+```
+
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic', batching_enabled=False)
+# 3 messages with "key-1", 3 messages with "key-2", 2 messages with "key-3" 
and 2 messages with "key-4"
+producer.send(b'message-1-1', partition_key='key-1')
+producer.send(b'message-1-2', partition_key='key-1')
+producer.send(b'message-1-3', partition_key='key-1')
+producer.send(b'message-2-1', partition_key='key-2')
+producer.send(b'message-2-2', partition_key='key-2')
+producer.send(b'message-2-3', partition_key='key-2')
+producer.send(b'message-3-1', partition_key='key-3')
+producer.send(b'message-3-2', partition_key='key-3')
+producer.send(b'message-4-1', partition_key='key-4')
+producer.send(b'message-4-2', partition_key='key-4')
 ```
 
   </TabItem>
@@ -57,7 +75,7 @@ Create a new consumer and subscribe with the `Exclusive` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -68,6 +86,14 @@ Consumer consumer = client.newConsumer()
         .subscribe()
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe('my-topic', 'my-subscription',
+                             consumer_type=pulsar.ConsumerType.Exclusive)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -87,7 +113,7 @@ Create new consumers and subscribe with the `Failover` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -105,6 +131,16 @@ Consumer consumer2 = client.newConsumer()
 //consumer1 receives 5 messages and then crashes, consumer2 takes over as an  
active consumer.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Failover)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Failover)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -144,7 +180,7 @@ Create new consumers and subscribe with `Shared` 
subscription type.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -162,6 +198,16 @@ Consumer consumer2 = client.newConsumer()
 //Both consumer1 and consumer2 are active consumers.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Shared)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.Shared)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -197,7 +243,7 @@ This is a new subscription type since 2.4.0 release. Create 
new consumers and su
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -215,6 +261,16 @@ Consumer consumer2 = client.newConsumer()
 //Both consumer1 and consumer2 are active consumers.
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer1 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.KeyShared)
+consumer2 = client.subscribe('my-topic', 'my-subscription',
+                              consumer_type=pulsar.ConsumerType.KeyShared)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -246,7 +302,7 @@ If batching is enabled at the producer side, messages with 
different keys are ad
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -256,6 +312,14 @@ Producer producer = client.newProducer()
         .create();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic',
+                                   batching_type=pulsar.BatchingType.KeyBased)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -265,7 +329,7 @@ Or the producer can disable batching.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -275,6 +339,13 @@ Producer producer = client.newProducer()
         .create();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+producer = client.create_producer('my-topic', batching_enabled=False)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -430,7 +501,7 @@ This example shows how a consumer unsubscribes from a topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -446,6 +517,14 @@ This example shows how a consumer unsubscribes from a 
topic.
    ```
 
   </TabItem>
+
+<TabItem value="Python">
+
+   ```python
+   consumer.unsubscribe()
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -462,7 +541,7 @@ This example shows how a consumer receives messages from a 
topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}, {"label":"C#","value":"C#"}]}>
+  values={[{"label":"Java","value":"Java"}, {"label":"C#","value":"C#"}, 
{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -481,6 +560,14 @@ This example shows how a consumer receives messages from a 
topic.
    ```
 
  </TabItem>
+
+<TabItem value="Python">
+
+   ```python
+   msg = consumer.receive()
+   ```
+
+ </TabItem>
 </Tabs>
 ````
 
@@ -489,7 +576,7 @@ This example shows how a consumer receives messages from a 
topic.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}, {"label":"Go","value":"Go"}]}>
+  values={[{"label":"Java","value":"Java"}, {"label":"Go","value":"Go"}, 
{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -534,6 +621,18 @@ This example shows how a consumer receives messages from a 
topic.
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+   ```python
+   # Receive with 10 second timeout (timeout in milliseconds)
+   try:
+       msg = consumer.receive(timeout_millis=10000)
+   except Exception:
+       print("No message received within timeout period")
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -546,7 +645,7 @@ The following is an example.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
    ```java
@@ -556,6 +655,22 @@ The following is an example.
    Async receive operations return a 
[Message](/api/client/org/apache/pulsar/client/api/Message) wrapped inside of a 
[`CompletableFuture`](http://www.baeldung.com/java-completablefuture).
 
  </TabItem>
+ <TabItem value="Python">
+
+   ```python
+   import asyncio
+
+   async def receive_messages():
+       msg = await consumer.receive_async()
+       return msg
+
+   # Use in async context
+   msg = asyncio.run(receive_messages())
+   ```
+
+   Async receive operations in Python use asyncio and return a coroutine that 
resolves to a Message.
+
+ </TabItem>
 </Tabs>
 ````
 
@@ -568,7 +683,7 @@ The following is an example.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -577,6 +692,17 @@ for (Object message : messages) {
   // do something
 }
 consumer.acknowledge(messages)
+```
+
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+messages = consumer.batch_receive()
+for msg in messages:
+    # do something
+    pass
+consumer.acknowledge(messages)
 ```
 
   </TabItem>
@@ -621,7 +747,7 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   ```java
@@ -636,6 +762,13 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
   await consumer.Acknowledge(message);
   ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+  ```python
+  consumer.acknowledge(msg)
+  ```
+
   </TabItem>
 </Tabs>
 ````
@@ -645,7 +778,7 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   ```java
@@ -659,6 +792,13 @@ Messages can be acknowledged individually or cumulatively. 
For details about mes
   await consumer.AcknowledgeCumulative(message);
   ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+  ```python
+  consumer.acknowledge_cumulative(msg)
+  ```
+
   </TabItem>
 </Tabs>
 ````
@@ -670,7 +810,7 @@ The `RedeliveryBackoff` introduces a redelivery backoff 
mechanism. You can achie
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -684,6 +824,17 @@ Consumer consumer =  client.newConsumer()
         .subscribe();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe(
+    'my-topic',
+    'my-subscription',
+    negative_ack_redelivery_delay_ms=1000
+)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -695,7 +846,7 @@ The `RedeliveryBackoff` introduces a redelivery backoff 
mechanism. You can redel
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -711,6 +862,17 @@ Consumer consumer =  client.newConsumer()
         .subscribe();
 ```
 
+  </TabItem>
+  <TabItem value="Python">
+
+```python
+consumer = client.subscribe(
+    'my-topic',
+    'my-subscription',
+    unacked_messages_timeout_ms=10000
+)
+```
+
   </TabItem>
 </Tabs>
 ````
@@ -793,7 +955,7 @@ You can avoid running a loop by blocking calls with an 
event-based style by usin
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 ```java
@@ -910,6 +1072,29 @@ func main() {
         consumer.Ack(msg)
     }
 }
+```
+
+  </TabItem>
+
+  <TabItem value="Python">
+
+```python
+def my_listener(consumer, message):
+    try:
+        print("Received message: '{}' id='{}'".format(
+            message.data(),
+            message.message_id()
+        ))
+        consumer.acknowledge(message)
+    except Exception as e:
+        consumer.negative_acknowledge(message)
+        print("Error processing message:", e)
+
+consumer = client.subscribe(
+    'persistent://my-property/my-ns/my-topic',
+    'my-subscription',
+    message_listener=my_listener
+)
 ```
 
   </TabItem>
diff --git a/versioned_docs/version-4.1.x/client-libraries-producers.md 
b/versioned_docs/version-4.1.x/client-libraries-producers.md
index 98e6fa0fb70..5d7f1078600 100644
--- a/versioned_docs/version-4.1.x/client-libraries-producers.md
+++ b/versioned_docs/version-4.1.x/client-libraries-producers.md
@@ -19,7 +19,7 @@ This example shows how to create a producer.
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Python","value":"Python"}]}>
 
   <TabItem value="Java">
 
@@ -50,6 +50,14 @@ This example shows how to create a producer.
   ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  ```python
+  producer = client.create_producer('my-topic')
+  ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -64,7 +72,7 @@ This example shows how to publish messages using producers. 
The publish operatio
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Node.js","value":"Node.js"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Node.js","value":"Node.js"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
   Publish messages synchronously:
@@ -183,6 +191,14 @@ await producer.Send(data);
 ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  ```python
+  producer.send('Hello World'.encode('utf-8'))
+  ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -193,7 +209,7 @@ You can set various properties of Pulsar's messages. The 
values of these propert
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"C#","value":"C#"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"C#","value":"C#"},{"label":"Python","value":"Python"}]}>
 
 <TabItem value="Java">
 
@@ -260,6 +276,16 @@ You can set various properties of Pulsar's messages. The 
values of these propert
                               .Send(data);
   ```
 
+</TabItem>
+
+<TabItem value="Python">
+
+  ```python
+  producer.send('content'.encode('utf-8'),
+                properties={'my-key': 'my-value', 'my-other-key': 
'my-other-value'},
+                event_timestamp=int(time.time() * 1000))
+  ```
+
 </TabItem>
 </Tabs>
 ````
@@ -279,7 +305,7 @@ The following is an example:
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
   <TabItem value="Java">
 
    ```java
@@ -320,6 +346,17 @@ The following is an example:
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+   ```python
+    producer = client.create_producer(
+        'my-topic',
+        message_routing_mode=PartitionsRoutingMode.SinglePartition
+    )
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 
@@ -328,7 +365,7 @@ The following is an example:
 ````mdx-code-block
 <Tabs groupId="lang-choice"
   defaultValue="Java"
-  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+  
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
 
 To use a custom message router, you need to provide an implementation of the 
[MessageRouter](/api/client/org/apache/pulsar/client/api/MessageRouter) 
interface, which has just one `choosePartition` method:
@@ -416,6 +453,23 @@ result = producer.send(msg);
    ```
 
   </TabItem>
+
+  <TabItem value="Python">
+
+  In the Python client, you can configure a customized message router by 
passing a function.
+   ```python
+    def custom_message_router(msg: pulsar.Message, num_partitions: int):
+        # always push msg to partition 10
+        return 10
+
+    producer = client.create_producer(
+        'my-topic',
+        message_router=custom_message_router
+    )
+    producer.send(b'content')
+   ```
+
+  </TabItem>
 </Tabs>
 ````
 

Reply via email to