Multithreaded generation#
The four core distributions (random,
standard_normal, standard_exponential,
and standard_gamma) all allow existing arrays to be filled
using the out keyword argument. Existing arrays need to be contiguous and
well-behaved (writable and aligned). Under normal circumstances, arrays
created using the common constructors such as numpy.empty will satisfy
these requirements.
See also
Thread Safety for general information about thread safety in NumPy.
This example makes use of concurrent.futures to fill an array using
multiple threads. Threads are long-lived so that repeated calls do not
require any additional overheads from thread creation.
The random numbers generated are reproducible in the sense that the same seed will produce the same outputs, given that the number of threads does not change.
from numpy.random import default_rng, SeedSequence
import multiprocessing
import concurrent.futures
import numpy as np
class MultithreadedRNG:
def __init__(self, n, seed=None, threads=None):
if threads is None:
threads = multiprocessing.cpu_count()
self.threads = threads
seq = SeedSequence(seed)
self._random_generators = [default_rng(s)
for s in seq.spawn(threads)]
self.n = n
self.executor = concurrent.futures.ThreadPoolExecutor