Отвечать на мой собственный вопрос:
При записи оператора обновления, запишите его не в порядке.
UPDATE [table-name]
WHERE [conditions]
SET [columns-and-values]
Выбор строк, которые Вы хотите обновить перед высказыванием, что оценивает Вас, хотят измениться, намного более безопасно, чем выполнение его в другом порядке. Это лишает возможности update person set email = 'bob@bob.com'
находиться в Вашем окне запроса, готовом быть выполненным неуместным нажатием клавиши, готовым испортить каждую строку в таблице.
Редактирование: Как другие сказали, запишите WHERE
, пункт для Вашего удаляет перед записью DELETE
.
GIL действительно предназначен для каждого процесса, а не для каждого интерпретатора. Это не изменилось в 3.x.
Возможно, путаница возникает из-за того, что большинство людей предположим, что у Python есть один интерпретатор на процесс. Я помню, как читал, что поддержка нескольких интерпретаторов через C API в основном не тестировалась и почти никогда не использовалась. (И когда я попробовал, не сработало должным образом.)
Я считаю, что верно (по крайней мере, начиная с Python 2.6), что каждый процесс может иметь не более одного встроенного интерпретатора CPython (другие среды выполнения могут иметь другие ограничения). Я не уверен, что это проблема GIL как такового, но, вероятно, это связано с глобальным состоянием или для защиты от конфликтующего глобального состояния в сторонних модулях C. Из документации API CPython :
[Py ___ Initialize ()] не работает при повторном вызове (без первого вызова Py_Finalize ()). Нет возвращаемого значения; это фатальная ошибка, если инициализация не удалась.
Возможно, вас заинтересует проект Unladen Swallow , цель которого в конечном итоге полностью удалить GIL из CPython. В других средах выполнения Python вообще нет GIL, например (я полагаю) Stackless Python и, конечно, Jython .
Также обратите внимание, что GIL все еще присутствует в CPython 3.x .