Какова разница между процессами и потоками в python?
На данный момент я имею много-поточное приложение написанное на py3.7,которое работает с апи мессенджера. Обработкой каждого сообщения занимается отдельный поток. В своём приложении я использую sqlite3, для работы с базой данных, и не так давно я наткнулся на лок базы данных, предположительно из-за того, что каждый созданный поток так или иначе взаимодействовал с базой данных, и в какой-то момент потоки пересеклись, создавая запись в БД в одно и то же время. Команда fuser показала, что одну и ту же базу данных использовало сразу несколько потоков одновременно даже после остановки главного приложения. Отсюда вопрос - какова принципиальная разница между потоками и процессами в python, и закрываются ли процессы/потоки автоматически, после завершения задачи? Так же, если я заменю все свои процессы на потоки - остаётся ли вероятность повторного лока базы данных? Для работы с БД использую PeeWee ORM'ку.
Ответы (2 шт):
Потоки это те же самые потоки, что и в других языках, но они синхронизируюится через GIL. Одновременно выполняется только один поток. Переменные у потоков общие.
Процессы выполняются раздельно и у каждого свой отдельный GIL. Процессы выполняются одновременно. Переменные не помещенные в общую память у каждого процесса свои. Процессы могут завершаться вместе с главным, а могут не завершиться.
Для вычислений с нагрузкой на CPU лучше использовать процессы. Для ожидания ввода-вывода, работе с файлами и сетью подойдут и потоки.
На потоках у вас будет одно подключение к базе данных.
Ответ не верный выше. Потоки в python -- это не те же самые потоки, что и в операционной системе. По сути, ОС ничего не знает о потоках в интерпретаторе python, так как это не нативные потоки, а потоки виртуальной машины python. Именно поэтому в python работу потоков контролировать легче, чем потоки ОС. Но тем не менее, база данных -- является внешним системным потоком по отношению к внутренним потокам интерпретатора. И поэтому база данных использует мьютексы уровня ядра. И если мьютекс захвачен одним из потоков python -- другие потоки python ничего с этим сделать не смогут. Т.к. python не контролирует внешний мьютекс.