Serik Shaikamalov
Serik Shaikamalov

Reputation: 111

Send push notification to many users via python

For my project using Firebase messaging to send push notification. I have users's firebase tokens stored on the database. Using them I sent push to each user. Total time of sending is about 100 seconds for 100 users. Is there way to send push asynchronously(I mean at one time to send many push notifications)

# Code works synchronously
for user in users:
    message = messaging.Message(                
            notification=messaging.Notification(
              title="Push title",
              body="Push body"
              ),
              token = user['fcmToken']
          )

    response = messaging.send(message)

Upvotes: 1

Views: 2488

Answers (3)

Moritz
Moritz

Reputation: 1

Unfortunately the send_multicast method got deprecated in June 2024 and you have to iterate over your FCM tokens now. See source: https://firebase.google.com/docs/cloud-messaging/send-message#send-messages-to-multiple-devices

Upvotes: 0

Frank van Puffelen
Frank van Puffelen

Reputation: 598603

If you want to send the same message to all tokens, you can use a single API call with a multicast message. The Github repo has this sample of sending a multicast message in Python:

def send_multicast():
    # [START send_multicast]
    # Create a list containing up to 500 registration tokens.
    # These registration tokens come from the client FCM SDKs.
    registration_tokens = [
        'YOUR_REGISTRATION_TOKEN_1',
        # ...
        'YOUR_REGISTRATION_TOKEN_N',
    ]

    message = messaging.MulticastMessage(
        data={'score': '850', 'time': '2:45'},
        tokens=registration_tokens,
    )
    response = messaging.send_multicast(message)
    # See the BatchResponse reference documentation
    # for the contents of response.
    print('{0} messages were sent successfully'.format(response.success_count))
    # [END send_multicast]

Upvotes: 1

FiddleStix
FiddleStix

Reputation: 3721

Sure, you could use one of the python concurrency libraries. Here's one option:

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED

def send_message(user):
    message = messaging.Message(                
        notification=messaging.Notification(
            title="Push title",
            body="Push body"),
        token = user['fcmToken'])

    return messaging.send(message)

with ThreadPoolExecutor(max_workers=10) as executor:  # may want to try more workers
    future_list = []
    for u in users:
        future_list.append(executor.submit(send_message, u))

    wait(future_list, return_when=ALL_COMPLETED)

    # note: we must use the returned self to get the test count
    print([future.result() for future in future_list])

Upvotes: 4

Related Questions