[英]How to quickly send messages to azure queue storage using python?
我正在嘗試使用 python azure.storage.queue 庫向 azure 發送大量消息(數千萬),但是這樣做需要很長時間。 我正在使用的代碼如下:
from azure.storage.queue import (
QueueClient,
BinaryBase64EncodePolicy,
BinaryBase64DecodePolicy
)
messages = [example list of messages]
connectionString = "example connection string"
queueName = "example-queue-name"
queueClient = QueueClient.from_connection_string(connectionString, queueName)
for message in messages:
queueClient.send_message(message)
目前,發送大約 70,000 條消息需要 3 個小時的時間,考慮到需要發送的潛在消息數量,這顯然太慢了。
我查看了文檔以嘗試找到批處理選項,但似乎不存在: https : //docs.microsoft.com/en-us/python/api/azure-storage-queue/azure.storage.queue.queueclient ?view=azure-python
我還想知道是否有人有使用 asynchio 庫來加速這個過程的經驗,並且可以建議如何使用它?
嘗試這個:
from azure.storage.queue import (
QueueClient,
BinaryBase64EncodePolicy,
BinaryBase64DecodePolicy
)
from concurrent.futures import ProcessPoolExecutor
import time
messages = []
messagesP1 = messages[:len(messages)//2]
messagesP2 = messages[len(messages)//2:]
print(len(messagesP1))
print(len(messagesP2))
connectionString = "<conn str>"
queueName = "<queue name>"
queueClient = QueueClient.from_connection_string(connectionString, queueName)
def pushThread(messages):
for message in messages:
queueClient.send_message(message)
def callback_function(future):
print('Callback with the following result', future.result())
tic = time.perf_counter()
def main():
with ProcessPoolExecutor(max_workers=2) as executor:
future = executor.submit(pushThread, messagesP1)
future.add_done_callback(callback_function)
future2 = executor.submit(pushThread, messagesP2)
while True:
if(future.running()):
print("Task 1 running")
if(future2.running()):
print("Task 2 running")
if(future.done() and future2.done()):
print(future.result(), future2.result())
break
if __name__ == '__main__':
main()
toc = time.perf_counter()
print(f"spent {toc - tic:0.4f} seconds")
如您所見,我將消息數組拆分為 2 部分,並使用 2 個任務同時將數據推送到隊列中。 根據我的測試,我有大約 800 條消息,推送所有消息需要花費 94 秒:
但是使用上面的方式,它花費了我48s:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.