Message291534
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.) |
|
Date |
User |
Action |
Args |
2017-04-12 09:24:49 | vstinner | set | recipients:
+ vstinner |
2017-04-12 09:24:49 | vstinner | set | messageid: <1491989089.77.0.552733144958.issue30051@psf.upfronthosting.co.za> |
2017-04-12 09:24:49 | vstinner | link | issue30051 messages |
2017-04-12 09:24:49 | vstinner | create | |
|