Concurrent PRAW Instances¶
By default, PRAW works great when there is a one-to-one mapping between running
PRAW processes, and the IP address / user account that you make requests
from. In fact, as of version 2.1.0, PRAW has multithreaded support as long as
there is a one-to-one mapping between thread and PRAW Reddit object
instance. That is, in order to be thread safe, each thread needs to have its
own Reddit instance [1]. In addition to multithreaded rate-limiting
support, PRAW 2.1.0 added multiprocess rate limiting support.
| [1] | It is undetermined at this time if the same authentication credentials can be used on multiple instances where the modhash is concerned. |
praw-multiprocess¶
PRAW version 2.1.0 and later install with a program praw-multiprocess. This
program provides a request handling server that manages the rate-limiting and
caching of any PRAW process which directs requests toward it. Starting
praw-multiprocess is as simple as running praw-multiprocess from your
terminal / command line assuming you installed PRAW
properly.
By default praw-multiprocess will listen only on localhost port
10101. You can adjust those settings by passing in --addr and --port
arguments respectively. For instance to have praw-multiprocess listen on
all valid addresses on port 65000, execute via: praw-multiprocess --addr
0.0.0.0 --port 65000. For a full list of options execute praw-multiprocess
--help.
PRAW’s MultiprocessingHandler¶
In order to interact with a praw-multiprocess server, PRAW needs to be
instructed to use the MultiprocessHandler rather than the
DefaultHandler. In your program you need to pass an instance of
MultiprocessHandler into the handler keyword argument when
creating the Reddit instance. Below is an example to connect to a
praw-multiprocess server running with the default arguments:
import praw
from praw.handlers import MultiprocessHandler
handler = MultiprocessHandler()
r = praw.Reddit(user_agent='a descriptive user-agent', handler=handler)
With this configuration, all network requests made from your program(s) that include the above code will be proxied through the praw-multiprocess server. All requests made through the same praw-multiprocess server will respect reddit’s API rate-limiting rules
If instead, you wish to connect to a praw-multiprocess server running at
address 10.0.0.1 port 65000 then you would create the PRAW instance via:
import praw
from praw.handlers import MultiprocessHandler
handler = MultiprocessHandler('10.0.0.1', 65000)
r = praw.Reddit(user_agent='a descriptive user-agent', handler=handler)
PRAW Multiprocess Resiliency¶
With all client/server type programs there is the possibility of network issues
or simply a lack of an available server. PRAW’s MultiprocessHandler
was created to be quite resilient to such issues. PRAW will retry indefinitely
to connect to praw-multiprocess server. This means that a
praw-multiprocess server can be stopped and restarted without any effect on
programs utilizing it.
On the other hand, consecutive network failures where the
MultiprocessHandler has no issue establishing a connection to a
praw-multiprocess server will result in ClientException after
three failures. Such failures are not expected to occur and if
reproducable should be reported.