2017-05-17 2 views
1

J'utilise l'api Reddit pour augmenter certains subreddits. J'aimerais augmenter plusieurs sous-subreds simultanément, en utilisant la bibliothèque praw pour interagir avec l'api reddit.Comment puis-je exécuter des lots de requêtes simultanément en python?

Je veux upvote les 27 « chauds » et les messages « hausse » de/r/bookclub:

subreddit = reddit.subreddit("bookclub") 

for submission in subreddit.hot(limit=27): 
    submission.upvote() 

for submission in subreddit.rising(limit=27): 
    submission.upvote() 

Je voudrais utiliser ou async multitraitement pour le faire plus rapidement. J'ai utilisé la bibliothèque grequests pour faire tout le .upvote() à la fois, et cela fonctionne jusqu'à présent, mais je ne suis pas sûr que ce soit vraiment mieux:

subreddit = reddit.subreddit("bookclub") 

hot_upvotes = (grequests.get(submission.upvote()) for submission in subreddit.hot(limit=27)) 
grequests.map(hot_upvotes) 

rising_upvotes = (grequests.get(submission.upvote()) for submission in subreddit.rising(limit=27)) 
grequests.map(rising_upvotes) 

Les deux versions Upvote subreddit. Ce que je me demande est s'il est possible d'exécuter les portions hot_upvotes et rising_upvotes en même temps?

Répondre

1
from threading import Thread 
import functools 

subreddit = reddit.subreddit("bookclub") 

def run_hot_upvotes(subreddit): 
    hot_upvotes = (grequests.get(submission.upvote()) for submission in subreddit.hot(limit=27)) 
    grequests.map(hot_upvotes) 

def run_rising_upvotes(subreddit): 
    rising_upvotes = (grequests.get(submission.upvote()) for submission in subreddit.rising(limit=27)) 
    grequests.map(rising_upvotes) 

Thread(target = functools.partial(run_rising_upvotes, subreddit)).start() 
Thread(target = functools.partial(run_hot_upvotes, subreddit)).start() 

Essayez ce qui suit pour que les deux s'exécutent en même temps, chacun dans son propre thread.

+0

Existe-t-il un moyen de passer un argument aux fonctions 'run_hot_upvotes()' et 'run_rising_upvotes()' quand elles sont exécutées? Comme 'run_hot_upvotes (subreddit)' –

+0

j'obtiens un 'NameError: nom global 'subreddit' n'est pas défini'. Besoin de comprendre comment le transmettre à chaque fonction. –

+0

J'ai ajouté un 'args' et cela a fonctionné. Thread (target = run_hot_upvotes, args = (subreddit,)). Start() ' –