Last active
November 25, 2020 11:00
-
-
Save gcrsaldanha/2d4709f604212e4ebbd9b5e2dc9b4a67 to your computer and use it in GitHub Desktop.
Python concurrency example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time # I will use it to simulate latency with time.sleep | |
from concurrent.futures import ThreadPoolExecutor, as_completed | |
def has_facebook_account(user_email): | |
time.sleep(5) # 5 seconds! That is bad. | |
print("Finished facebook after 5 seconds!") | |
return True | |
def has_github_account(user_email): | |
time.sleep(1) # 1 second. Phew! | |
print("Finished github after 1 second!") | |
return True | |
def has_twitter_account(user_email): | |
time.sleep(3) # Well... | |
print("Finished twitter after 3 seconds!") | |
return False | |
# Main method that answers if an user has an account in any of the platforms | |
def has_social_account(user_email): | |
# ThreadPoolExecutor is a subclass of Executor that uses threads. | |
# max_workers is the max number of threads that will be used. | |
# Since we are scheduling only 3 tasks, it does not make sense to have | |
# more than 3 threads, otherwise we would be wasting resources. | |
executor = ThreadPoolExecutor(max_workers=3) | |
# Schedule (submit) 3 tasks (one for each social account check) | |
# .submit method returns a Future object | |
facebook_future = executor.submit(has_facebook_account, user_email) | |
twitter_future = executor.submit(has_twitter_account, user_email) | |
github_future = executor.submit(has_github_account, user_email) | |
future_list = [facebook_future, github_future, twitter_future] | |
# as_completed receives an iterable of Future objects | |
# and yields each future once it has been completed. | |
for future in as_completed(future_list): | |
# .result() returns the future object return value | |
future_return_value = future.result() | |
print(future_return_value) | |
if future_return_value is True: | |
# I can early return once any result is True | |
return True | |
user_email = "[email protected]" | |
if __name__ == '__main__': | |
has_social_account(user_email) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment