32.21. Ðоведение в многопоÑоÑнÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ð°Ñ #
ÐаÑÐ¸Ð½Ð°Ñ Ñ Ð²ÐµÑÑии 17, библиоÑека libpq вÑегда поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð²ÑоÑнÑе вÑÐ·Ð¾Ð²Ñ Ð¸ многопоÑоÑноÑÑÑ. Ðднако ÑÑа ÑеализаÑÐ¸Ñ Ð½Ðµ лиÑена огÑаниÑений: два поÑока не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑÑаÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно ÑабоÑаÑÑ Ñ Ð¾Ð´Ð½Ð¸Ð¼ обÑекÑом PGconn. Ð ÑаÑÑноÑÑи, не допÑÑкаеÑÑÑ Ð¿Ð°ÑаллелÑное вÑполнение команд из ÑазнÑÑ
поÑоков ÑеÑез один обÑÐµÐºÑ ÑоединениÑ. (ÐÑли вам нÑжно вÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¾Ð´Ð½Ð¾Ð²Ñеменно, иÑполÑзÑйÑе неÑколÑко Ñоединений.)
ÐбÑекÑÑ PGresult поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑно доÑÑÑÐ¿Ð½Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ, и поÑÑÐ¾Ð¼Ñ Ð¸Ñ
можно Ñвободно пеÑедаваÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð¾Ñоками. Ðднако еÑли Ð²Ñ Ð¸ÑполÑзÑеÑе какÑÑ-либо из ÑÑнкÑий, изменÑÑÑиÑ
PGresult, опиÑаннÑÑ
в Разделе 32.12 или Разделе 32.14, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ñакже избегаÑÑ Ð¾Ð´Ð½Ð¾Ð²ÑеменнÑÑ
обÑаÑений к Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ PGresult.
Ð ÑÐ°Ð½Ð½Ð¸Ñ Ð²ÐµÑÑиÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ libpq можно бÑло ÑобÑаÑÑ Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой многопоÑоÑноÑÑи или без неÑ, в завиÑимоÑÑи Ð¾Ñ Ð¿Ð°ÑамеÑÑов компилÑÑоÑа. ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÑзнаÑÑ, поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð»Ð¸ libpq многопоÑоÑноÑÑÑ:
PQisthreadsafe#ÐозвÑаÑÐ°ÐµÑ ÑоÑÑоÑние поÑокобезопаÑноÑÑи в библиоÑеке libpq.
int PQisthreadsafe();
ÐозвÑаÑÐ°ÐµÑ 1, еÑли библиоÑека libpq поÑокобезопаÑнаÑ, или 0 в пÑоÑивном ÑлÑÑае. ÐаÑÐ¸Ð½Ð°Ñ Ñ Ð²ÐµÑÑии 17, вÑегда возвÑаÑÐ°ÐµÑ 1.
УÑÑаÑевÑие ÑÑнкÑии PQrequestCancel и PQoidStatus не ÑвлÑÑÑÑÑ Ð¿Ð¾ÑокобезопаÑнÑми и не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑименÑÑÑÑÑ Ð² многопоÑоÑнÑÑ
пÑогÑаммаÑ
. ÐмеÑÑо PQrequestCancel можно иÑполÑзоваÑÑ PQcancelBlocking, а вмеÑÑо PQoidStatus â PQoidValue.
ÐÑли пÑоÑокол Kerberos пÑименÑеÑÑÑ Ð² полÑзоваÑелÑÑком пÑиложении (помимо возможного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÑÑÑи libpq), Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ обеÑпеÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð²Ð¾ÐºÑÑг вÑзовов Kerberos, Ñак как его ÑÑнкÑии не ÑвлÑÑÑÑÑ Ð¿Ð¾ÑокобезопаÑнÑми.
ÐоÑ
ожим обÑазом, еÑли Ð²Ñ Ð¸ÑполÑзÑеÑе в ÑамкаÑ
Ñвоего пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Curl и еÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»Ñно не иниÑиализиÑовали libcurl пеÑед запÑÑком новÑÑ
поÑоков, вам необÑ
одимо бÑÐ´ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ Ð»Ñбой код (опÑÑÑ Ð¶Ðµ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ PQregisterThreadLock), коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð½Ð¸ÑиализиÑоваÑÑ libcurl. Рболее новÑÑ
веÑÑиÑÑ
Curl Ñакое огÑаниÑение оÑÑÑÑÑÑвÑеÑ, поÑколÑÐºÑ Ð¾Ð½Ð¸ ÑабоÑаÑÑ Ñ Ð¸Ð½Ð¸ÑиализаÑией безопаÑнÑÑ
поÑоков. Такие ÑбоÑки оÑлиÑаÑÑÑÑ ÑÑнкÑионалÑноÑÑÑÑ threadsafe в меÑаданнÑÑ
веÑÑии.