Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
if __name__ == '__main__': _test()
Блеск! Гонять тесты вычисления случайных чисел при импорте — это сильно.
if __name__ == "__main__":
Вдруг /dev/urandom, шутник, будет возвращать не случайные числа

Как известно, первое устройство «медленное» и блокирующее, а второе «быстрое», и вопреки распространенному мнению, оба они криптостойкие источники (псевдо-)случайных чисел (http://www.2uo.de/myths-about-urandom/).
Если в одном процессе файл будет закрыт, то он будет автоматически закрыт и в другом.Это заявление не соответствует действительности. Закрытие дескриптора в одном процесе не приводит к закрытию дескрипторов в другом. Собственно, при использовании связки fork+exec необходимо перед exec специально пробегаются по всем открытым дескрипторам (кроме stdin, stdout и stderr), закрывая их. Так же рекомендую посмотреть схему с перенаправлением вывода с pipe+fork+exec.
#include <stdio.h>
#include <unistd.h>
int main (int argc, char**argv)
{
FILE* handle = fopen("/tmp/test.txt", "w");
if(fork()==0)
{
sleep(2);
fprintf(handle, "test\n");
fclose(handle);
printf("2 finished\n");
}
else
{
fclose(handle);
printf("1 finished\n");
}
return 0;
}
И тут чья-то светлая голова предлагает ускорить этот код. Как это возможно, спросите вы. Закешировав файловый объект, отвечает светлая голова.
Можно тихонько исправить (переоткрыть)Нельзя. Вообще нельзя использовать дескриптор после закрытия. С тем же номером может быть открыт уже другой файл. Надо чинить fork.
К счастью, люди смогли убедить царя в обратном, и, наконец, в июле кеширование /dev/urandom убрали — прошло более полугода. Обращаю внимание на то, как это сделали: в коде нет ни ссылки на номер бага, ни указания на причины патча, ни, в конце концов, просто поясняющего комментария. Работает, и хорошо.
bug #1177468: don't cache /dev/urandom file descriptor in os.urandom [#1177468]
Bug #1177468: Don't cache the /dev/urandom file descriptor for os.urandom,
as this can cause problems with apps closing all file descriptors.
выходит Half-Life 2 CPython 2.4, добавляя такие привычные всем фичи как декораторы функций, множества (set), обратный порядок обхода (reversed) и list comprehensions, которые по ссылке названы generator expressions.
os.urandom, CPython, Linux и грабли