Mostly for the sake of the archives, I ended up with this 
<https://github.com/roysmith/dyk-tools/blob/60a0b1d5c6c5f7310a541f30388b898b4a906b10/dyk_tools/web/core.py#L69>,
 which is pretty much straight out of the example in the python library manual:

>     def _is_approved(nom):
>         return nom.is_approved()
> 
>     with ThreadPoolExecutor(max_workers=10) as executor:
>         future_to_nom = {
>             executor.submit(_is_approved, nom): nom for nom in 
> nom_list.nominations()
>         }
>         for future in as_completed(future_to_nom):
>             nom = future_to_nom[future]
>             if future.result():
>                 approved_noms.append(nom)
>             else:
>                 unapproved_noms.append(nom)



One of the nagging questions in my mind as I was exploring this was whether 
APISite is thread-safe.  I haven't found anything in the pywikibot docs which 
says one way or the other, but apparently it is.

I don't have a good feel for what max_workers should be.  For what I'm doing, 
10 seems to work well, taking about 2-3 seconds to process 70 nominations.  The 
largest number of nominations I would ever expect to see is around 200.  
According to the library docs, max_workers defaults to 5 * 
number_of_processors.  I don't actually have a clue what that works out to on a 
toolforge k8s instance, nor do I have any idea how the production enwiki would 
like it if I threw 100 parallel API requests at it all at once.  So for now, 
I'll just hardwire it to 10.


_______________________________________________
pywikibot mailing list -- pywikibot@lists.wikimedia.org
Public archives at 
https://lists.wikimedia.org/hyperkitty/list/pywikibot@lists.wikimedia.org/message/FJRZLS5CS2D3OVPJUESASLPFUS4ALUOT/
To unsubscribe send an email to pywikibot-le...@lists.wikimedia.org

Reply via email to