Какова разница между процессами и потоками в python?

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


Ответы (2 шт):

Автор решения: eri

Потоки это те же самые потоки, что и в других языках, но они синхронизируюится через GIL. Одновременно выполняется только один поток. Переменные у потоков общие.

Процессы выполняются раздельно и у каждого свой отдельный GIL. Процессы выполняются одновременно. Переменные не помещенные в общую память у каждого процесса свои. Процессы могут завершаться вместе с главным, а могут не завершиться.

Для вычислений с нагрузкой на CPU лучше использовать процессы. Для ожидания ввода-вывода, работе с файлами и сетью подойдут и потоки.

На потоках у вас будет одно подключение к базе данных.

→ Ссылка
Автор решения: prospero78su

Ответ не верный выше. Потоки в python -- это не те же самые потоки, что и в операционной системе. По сути, ОС ничего не знает о потоках в интерпретаторе python, так как это не нативные потоки, а потоки виртуальной машины python. Именно поэтому в python работу потоков контролировать легче, чем потоки ОС. Но тем не менее, база данных -- является внешним системным потоком по отношению к внутренним потокам интерпретатора. И поэтому база данных использует мьютексы уровня ядра. И если мьютекс захвачен одним из потоков python -- другие потоки python ничего с этим сделать не смогут. Т.к. python не контролирует внешний мьютекс.

→ Ссылка