This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author vstinner
Recipients vstinner
Date 2017-04-12.09:24:49
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1491989089.77.0.552733144958.issue30051@psf.upfronthosting.co.za>
In-reply-to
Content
When reviewing the issue #30030, it reminded me that the random module "doesn't support fork": after fork, the parent and the child produce the same "random" number sequence.

I suggest to add a quick note about that: not a warning, just a note, as a reminder.

There is an exception: SystemRandom produces a different sequence after fork, since it uses os.urandom() (which runs in the kernel).

I am tempted to propose a solution in the note like using SystemRandom, but I'm not sure that it's a good idea. Some users may misunderstood the note and always use SystemRandom where random.Random is just fine for their needs.

Proposed note:

The random module doesn't support fork: the parent and the child process will produce the same number sequence.

Proposed solution:

If your code uses os.fork(), a workaround is to check if os.getpid() changes and in that case, create a new Random instance or reseed the RNG in the child process.

--

The tempfile module reminds the pid and instanciates a new RNG on fork.

Another option is to not add a note, but implement the workaround directly into the random module. But I don't think that it's worth it. Forking is a rare usecase, and calling os.getpid() may slowdown the random module. (I don't recall if os.getpid() requires a syscall or not, I'm quite sure that it's optimized at least on Linux to avoid a real syscall.)
History
Date User Action Args
2017-04-12 09:24:49vstinnersetrecipients: + vstinner
2017-04-12 09:24:49vstinnersetmessageid: <1491989089.77.0.552733144958.issue30051@psf.upfronthosting.co.za>
2017-04-12 09:24:49vstinnerlinkissue30051 messages
2017-04-12 09:24:49vstinnercreate