簡體   English   中英

如何使用python快速將消息發送到azure隊列存儲?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM