Ðлава 47. ФоновÑе ÑабоÑие пÑоÑеÑÑÑ
Postgres Pro поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑаÑÑиÑеннÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð·Ð°Ð¿ÑÑкаÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкий код в оÑделÑнÑÑ
пÑоÑеÑÑаÑ
. Такие пÑоÑеÑÑÑ Ð·Ð°Ð¿ÑÑкаÑÑÑÑ, оÑÑанавливаÑÑÑÑ Ð¸ конÑÑолиÑÑÑÑÑÑ Ð³Ð»Ð°Ð²Ð½Ñм пÑоÑеÑÑом postgres, коÑоÑÑй позволÑÐµÑ ÑеÑно ÑвÑзаÑÑ Ð¸Ñ
жизненнÑй Ñикл Ñ ÑоÑÑоÑнием ÑеÑвеÑа. ÐÑи пÑоÑеÑÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð´Ð¾ÑÑÑп к облаÑÑи ÑазделÑемой памÑÑи Postgres Pro и могÑÑ ÑÑÑанавливаÑÑ Ð²Ð½ÑÑÑенние подклÑÑÐµÐ½Ð¸Ñ Ðº базам даннÑÑ
; они Ñакже могÑÑ Ð¿Ð¾ÑледоваÑелÑно запÑÑкаÑÑ ÑÑанзакÑии, как и обÑÑнÑе ÑеÑвеÑнÑе пÑоÑеÑÑÑ, обÑлÑживаÑÑие клиенÑов. ÐÑоме Ñого, иÑполÑзÑÑ libpq, они могÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑаÑÑÑÑ Ðº ÑеÑвеÑÑ Ð¸ ÑабоÑаÑÑ ÐºÐ°Ðº обÑÑнÑе клиенÑÑкие пÑиложениÑ.
ÐÑедÑпÑеждение
С иÑполÑзованием ÑоновÑÑ
ÑабоÑиÑ
пÑоÑеÑÑов ÑопÑÑÐ¶ÐµÐ½Ñ ÑгÑÐ¾Ð·Ñ ÑÑабилÑноÑÑи и безопаÑноÑÑи, Ñак как они ÑеализÑÑÑÑÑ Ð½Ð° ÑзÑке C, и знаÑÐ¸Ñ Ð¸Ð¼ÐµÑÑ Ð½ÐµÐ¾Ð³ÑаниÑеннÑй доÑÑÑп к даннÑм. ÐдминиÑÑÑаÑоÑÑ, желаÑÑие иÑполÑзоваÑÑ Ð¼Ð¾Ð´Ñли, в коÑоÑÑÑ
задейÑÑÐ²Ð¾Ð²Ð°Ð½Ñ ÑоновÑе ÑабоÑие пÑоÑеÑÑÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÐºÑайне оÑÑоÑожнÑми. ÐапÑÑкаÑÑ ÑабоÑие пÑоÑеÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑазÑеÑаÑÑ ÑолÑко модÑлÑм, пÑоÑедÑим вÑеÑÑоÑонний аÑдиÑ.
РабоÑие пÑоÑеÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸Ð½Ð¸ÑиализиÑоваÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð·Ð°Ð¿ÑÑка Postgres Pro, еÑли Ð¸Ð¼Ñ ÑооÑвеÑÑÑвÑÑÑего модÑÐ»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ в shared_preload_libraries. ÐодÑлÑ, желаÑÑий запÑÑÑиÑÑ ÑабоÑий пÑоÑеÑÑ, Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÑегиÑÑÑиÑоваÑÑ ÐµÐ³Ð¾, вÑзвав RegisterBackgroundWorker( из Ñвоей ÑÑнкÑии BackgroundWorker *worker)_PG_init(). РабоÑие пÑоÑеÑÑÑ Ñакже могÑÑ Ð±ÑÑÑ Ð·Ð°Ð¿ÑÑÐµÐ½Ñ Ð¿Ð¾Ñле запÑÑка ÑиÑÑÐµÐ¼Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии RegisterDynamicBackgroundWorker(. РоÑлиÑие Ð¾Ñ BackgroundWorker *worker, BackgroundWorkerHandle **handle)RegisterBackgroundWorker, коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзÑваÑÑ ÑолÑко из главного ÑпÑавлÑÑÑего пÑоÑеÑÑа, RegisterDynamicBackgroundWorker должна вÑзÑваÑÑÑÑ Ð¸Ð· обÑÑного обÑлÑживаÑÑего пÑоÑеÑÑа или дÑÑгого ÑабоÑего пÑоÑеÑÑа.
СÑÑÑкÑÑÑа BackgroundWorker опÑеделÑеÑÑÑ Ñак:
typedef void (*bgworker_main_type)(Datum main_arg);
typedef struct BackgroundWorker
{
char bgw_name[BGW_MAXLEN];
char bgw_type[BGW_MAXLEN];
int bgw_flags;
BgWorkerStartTime bgw_start_time;
int bgw_restart_time; /* вÑÐµÐ¼Ñ Ð² ÑекÑндаÑ
либо BGW_NEVER_RESTART */
char bgw_library_name[BGW_MAXLEN];
char bgw_function_name[BGW_MAXLEN];
Datum bgw_main_arg;
char bgw_extra[BGW_EXTRALEN];
pid_t bgw_notify_pid;
} BackgroundWorker;ÐÐ¾Ð»Ñ bgw_name и bgw_type ÑодеÑÐ¶Ð°Ñ ÑÑÑоки, вÑводимÑе в оÑладоÑнÑÑ
ÑообÑениÑÑ
, ÑпиÑкаÑ
пÑоÑеÑÑов и подобнÑÑ
конÑекÑÑаÑ
. СÑÑока bgw_type должна бÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ð¹ Ð´Ð»Ñ Ð²ÑеÑ
ÑабоÑиÑ
пÑоÑеÑÑов одного Ñипа, ÑÑÐ¾Ð±Ñ Ñакие пÑоÑеÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло ÑгÑÑппиÑоваÑÑ, напÑимеÑ, в ÑпиÑке пÑоÑеÑÑов. bgw_name, Ñ Ð´ÑÑгой ÑÑоÑонÑ, Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± опÑеделÑнном пÑоÑеÑÑе. (ÐбÑÑно ÑÑÑока bgw_name ÑодеÑÐ¶Ð¸Ñ Ñип в некоÑоÑом виде, но ÑÑÑого ÑÑо не ÑÑебÑеÑÑÑ.)
Ðоле bgw_flags пÑедÑÑавлÑÐµÑ Ð±Ð¸ÑовÑÑ Ð¼Ð°ÑкÑ, обознаÑаÑÑÑÑ Ð·Ð°Ð¿ÑаÑиваемÑе модÑлем возможноÑÑи. ÐопÑÑÑимÑе в нÑм Ñлаги:
BGWORKER_SHMEM_ACCESSÐапÑаÑÐ¸Ð²Ð°ÐµÑ Ð´Ð¾ÑÑÑп к обÑей памÑÑи. ÐÑÐ¾Ñ Ñлаг ÑвлÑеÑÑÑ Ð¾Ð±ÑзаÑелÑнÑм.
BGWORKER_BACKEND_DATABASE_CONNECTIONÐапÑаÑиваеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑÑÑанавливаÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение к базе даннÑÑ , ÑеÑез коÑоÑое можно запÑÑкаÑÑ ÑÑанзакÑии и запÑоÑÑ. РабоÑий пÑоÑеÑÑ, иÑполÑзÑÑÑий
BGWORKER_BACKEND_DATABASE_CONNECTIONÐ´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ðº базе даннÑÑ , должен Ñакже запÑоÑиÑÑ Ð´Ð¾ÑÑÑп к ÑазделÑемой памÑÑи, ÑÑÑановивBGWORKER_SHMEM_ACCESS; в пÑоÑивном ÑлÑÑае пÑоÑеÑÑ Ð½Ðµ запÑÑÑиÑÑÑ.
Ð bgw_start_time опÑеделÑеÑÑÑ ÑоÑÑоÑние ÑеÑвеÑа, в коÑоÑом postgres должен запÑÑÑиÑÑ ÑÑÐ¾Ñ Ð¿ÑоÑеÑÑ; возможнÑе ваÑианÑÑ: BgWorkerStart_PostmasterStart (вÑполниÑÑ Ð·Ð°Ð¿ÑÑк ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле Ñого, как postgres завеÑÑÐ¸Ñ Ð¸Ð½Ð¸ÑиализаÑиÑ; пÑоÑеÑÑÑ, вÑбиÑаÑÑие Ñакой Ñежим, не могÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑаÑÑÑÑ Ðº базам даннÑÑ
), BgWorkerStart_ConsistentState (вÑполниÑÑ Ð·Ð°Ð¿ÑÑк, когда бÑÐ´ÐµÑ Ð´Ð¾ÑÑигнÑÑо ÑоглаÑованное ÑоÑÑоÑние гоÑÑÑего ÑезеÑва, и когда пÑоÑеÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑаÑÑÑÑ Ðº базам даннÑÑ
и вÑполнÑÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð½Ð° ÑÑение), и BgWorkerStart_RecoveryFinished (вÑполниÑÑ Ð·Ð°Ð¿ÑÑк, как ÑолÑко ÑиÑÑема пеÑейдÑÑ Ð² обÑÑнÑй Ñежим ÑÑениÑ-запиÑи). ÐамеÑÑÑе, ÑÑо два поÑледниÑ
ваÑианÑа ÑазлиÑаÑÑÑÑ ÑолÑко Ð´Ð»Ñ ÑеÑвеÑов гоÑÑÑего ÑезеÑва. ÐамеÑÑÑе Ñакже, ÑÑо ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ ÑказÑÐ²Ð°ÐµÑ ÑолÑко, когда Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð¿ÑÑкаÑÑÑÑ Ð¿ÑоÑеÑÑÑ; пÑи пеÑеÑ
оде в дÑÑгое ÑоÑÑоÑние они не бÑдÑÑ Ð¾ÑÑанавливаÑÑÑÑ.
bgw_restart_time задаÑÑ Ð¿Ð°ÑÐ·Ñ (в ÑекÑндаÑ
), коÑоÑÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑделаÑÑ postgres, пÑежде Ñем пеÑезапÑÑкаÑÑ Ð¿ÑоÑеÑÑ Ð² ÑлÑÑае его оÑказа. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбое положиÑелÑное знаÑение, либо BGW_NEVER_RESTART, ÑказÑваÑÑее, ÑÑо пÑоÑеÑÑ Ð½Ðµ нÑжно пеÑезапÑÑкаÑÑ Ð² ÑлÑÑае ÑбоÑ.
bgw_library_name опÑеделÑÐµÑ Ð¸Ð¼Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки, в коÑоÑой ÑледÑÐµÑ Ð¸ÑкаÑÑ ÑоÑÐºÑ Ð²Ñ
ода Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка ÑабоÑего пÑоÑеÑÑа. Ð£ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека бÑÐ´ÐµÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки загÑÑжена ÑабоÑим пÑоÑеÑÑом, а вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑбÑана по имени bgw_function_name. ÐÐ»Ñ ÑÑнкÑии, вÑзÑваемой в коде ÑдÑа, в ÑÑом поле должно бÑÑÑ postgres.
bgw_function_name опÑеделÑÐµÑ Ð¸Ð¼Ñ ÑÑнкÑии, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÐºÐ°Ðº ÑоÑка вÑ
ода в новÑй ÑабоÑий пÑоÑеÑÑ. ÐÑли ÑÑа ÑÑнкÑÐ¸Ñ Ð² динамиÑеÑки загÑÑжаемой библиоÑеке, она должна бÑÑÑ Ð¿Ð¾Ð¼ÐµÑена как PGDLLEXPORT (а не бÑÑÑ Ð¿Ð¾Ð¼ÐµÑена как static).
Ð bgw_main_arg задаÑÑÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Datum, пеÑедаваемÑй оÑновной ÑÑнкÑии Ñонового пÑоÑеÑÑа. ÐÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° пÑинимаÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ Ñипа Datum и возвÑаÑаÑÑ void. РкаÑеÑÑве ÑÑого аÑгÑменÑа ей и пеÑедаÑÑÑÑ bgw_main_arg. ÐÑоме Ñого, глобалÑÐ½Ð°Ñ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ MyBgworkerEntry ÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÐºÐ¾Ð¿Ð¸Ñ ÑÑÑÑкÑÑÑÑ BackgroundWorker, пеÑеданной пÑи ÑегиÑÑÑаÑии; ÑодеÑжимое ÑÑой ÑÑÑÑкÑÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ ÑабоÑÐµÐ¼Ñ Ð¿ÑоÑеÑÑÑ.
Ð Windows (и везде, где опÑеделÑеÑÑÑ EXEC_BACKEND) или в динамиÑеÑкиÑ
ÑабоÑиÑ
пÑоÑеÑÑаÑ
пеÑедаваÑÑ Datum по ÑÑÑлке небезопаÑно, возможна ÑолÑко пеÑедаÑа по знаÑениÑ. ÐоÑÑÐ¾Ð¼Ñ ÐµÑли ÑÑнкÑии ÑÑебÑеÑÑÑ Ð°ÑгÑменÑ, наиболее безопаÑно бÑÐ´ÐµÑ Ð¿ÐµÑедаÑÑ int32 или дÑÑгое неболÑÑое знаÑение, ÑодеÑжаÑее Ð¸Ð½Ð´ÐµÐºÑ Ð² маÑÑиве, ÑазмеÑÑнном в ÑазделÑемой памÑÑи. ÐÑли же попÑÑаÑÑÑÑ Ð¿ÐµÑедаÑÑ Ð·Ð½Ð°Ñение cstring или text, ÑÑÐ¾Ñ ÑказаÑÐµÐ»Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð² новом ÑабоÑем пÑоÑеÑÑе.
Ðоле bgw_extra Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе даннÑе, пеÑедаваемÑе ÑÐ¾Ð½Ð¾Ð²Ð¾Ð¼Ñ ÑабоÑÐµÐ¼Ñ Ð¿ÑоÑеÑÑÑ. РоÑлиÑие Ð¾Ñ bgw_main_arg, ÑÑи даннÑе не пеÑедаÑÑÑÑ Ð² каÑеÑÑве аÑгÑменÑа оÑновной ÑÑнкÑии ÑабоÑего пÑоÑеÑÑа, но могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ ÑеÑез MyBgworkerEntry, как опиÑÑвалоÑÑ Ð²ÑÑе.
Ð bgw_notify_pid задаÑÑÑÑ PID обÑлÑживаÑÑего пÑоÑеÑÑа Postgres Pro, коÑоÑÐ¾Ð¼Ñ Ð³Ð»Ð°Ð²Ð½Ñй пÑоÑеÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ поÑÑлаÑÑ Ñигнал SIGUSR1 пÑи запÑÑке и завеÑÑении нового ÑабоÑего пÑоÑеÑÑа. ÐÑо поле должно ÑодеÑжаÑÑ 0 Ð´Ð»Ñ ÑабоÑиÑ
пÑоÑеÑÑов, ÑегиÑÑÑиÑÑемÑÑ
пÑи запÑÑке главного пÑоÑеÑÑа, либо когда обÑлÑживаÑÑий пÑоÑеÑÑ Ð½Ðµ Ð¶ÐµÐ»Ð°ÐµÑ Ð¶Ð´Ð°ÑÑ Ð¾ÐºÐ¾Ð½ÑÐ°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑÑка ÑабоÑего пÑоÑеÑÑа. Ðо вÑеÑ
оÑÑалÑнÑÑ
ÑлÑÑаÑÑ
в нÑм должно бÑÑÑ Ð·Ð½Ð°Ñение MyProcPid.
ÐапÑÑеннÑй пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑÑÑ Ðº базе даннÑÑ
, вÑзвав BackgroundWorkerInitializeConnection( или char *dbname, char *username, uint32 flags)BackgroundWorkerInitializeConnectionByOid(. ЧеÑез ÑÑо подклÑÑение пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑ ÑÑанзакÑии и запÑоÑÑ, иÑполÑзÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ Oid dboid, Oid useroid, uint32 flags)SPI. ÐÑли в dbname пеÑедаÑÑÑÑ NULL или dboid Ñавен InvalidOid, ÑÐµÐ°Ð½Ñ Ð½Ðµ подклÑÑаеÑÑÑ Ð½Ð¸ к какой конкÑеÑной базе даннÑÑ
, но Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº обÑим каÑалогам. ÐÑли в username пеÑедаÑÑÑÑ NULL или useroid Ñавен InvalidOid, пÑоÑеÑÑ Ð±ÑÐ´ÐµÑ Ð´ÐµÐ¹ÑÑвоваÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ ÑÑпеÑполÑзоваÑелÑ, Ñозданного во вÑÐµÐ¼Ñ initdb. ÐнаÑение BGWORKER_BYPASS_ALLOWCONN в поле flags позволÑÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑаÑÑÑÑ Ðº базам, не пÑинимаÑÑим подклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелей. РабоÑий пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзваÑÑ ÑолÑко Ð¾Ð´Ð½Ñ Ð¸Ð· ÑÑиÑ
двÑÑ
ÑÑнкÑий и ÑолÑко один Ñаз. ÐеÑеклÑÑаÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ даннÑÑ
он не можеÑ.
Ð¡Ð¸Ð³Ð½Ð°Ð»Ñ Ð¸Ð·Ð½Ð°ÑалÑно блокиÑÑÑÑÑÑ Ð¿Ñи вÑзове оÑновной ÑÑнкÑии ÑабоÑего пÑоÑеÑÑа и Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑазблокиÑÐ¾Ð²Ð°Ð½Ñ ÐµÐ¹: ÑÑо позволÑÐµÑ Ð¿ÑоÑеÑÑÑ Ð¿Ñи необÑ
одимоÑÑи наÑÑÑоиÑÑ ÑобÑÑвеннÑе обÑабоÑÑики ÑобÑÑий. ÐовÑй пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ ÑазблокиÑоваÑÑ ÑигналÑ, вÑзвав BackgroundWorkerUnblockSignals, и заблокиÑоваÑÑ Ð¸Ñ
, вÑзвав BackgroundWorkerBlockSignals.
ÐÑли bgw_restart_time Ð´Ð»Ñ ÑабоÑего пÑоÑеÑÑа Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение BGW_NEVER_RESTART, либо он завеÑÑаеÑÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ вÑÑ
ода 0, либо еÑли его ÑабоÑа заканÑиваеÑÑÑ Ð²Ñзовом TerminateBackgroundWorker, он авÑомаÑиÑеÑки пеÑеÑÑаÑÑ ÐºÐ¾Ð½ÑÑолиÑоваÑÑÑÑ ÑпÑавлÑÑÑим пÑоÑеÑÑом пÑи вÑÑ
оде. РпÑоÑивном ÑлÑÑае он бÑÐ´ÐµÑ Ð¿ÐµÑезапÑÑен ÑеÑез вÑемÑ, заданное в bgw_restart_time, либо немедленно, еÑли ÑпÑавлÑÑÑÐµÐ¼Ñ ÑеÑвеÑÑ Ð¿ÑиÑлоÑÑ Ð¿ÐµÑеиниÑиализиÑоваÑÑ ÐºÐ»Ð°ÑÑÐµÑ Ð¸Ð·-за ÑÐ±Ð¾Ñ Ð¾Ð±ÑлÑживаÑÑего пÑоÑеÑÑа. ÐбÑлÑживаÑÑие пÑоÑеÑÑÑ, коÑоÑÑм нÑжно ÑолÑко пÑиоÑÑановиÑÑ ÑÐ²Ð¾Ñ Ð²Ñполнение на вÑемÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÐµÑеÑ
одиÑÑ Ð² ÑоÑÑоÑние пÑеÑÑваемого ожиданиÑ, а не завеÑÑаÑÑÑÑ; Ð´Ð»Ñ ÑÑого иÑполÑзÑеÑÑÑ ÑÑнкÑÐ¸Ñ WaitLatch(). ÐÑи вÑзове ÑÑой ÑÑнкÑии обÑзаÑелÑно ÑÑÑановиÑе Ñлаг WL_POSTMASTER_DEATH и пÑовеÑÑÑе код возвÑаÑа, ÑÑÐ¾Ð±Ñ ÐºÐ¾ÑÑекÑно вÑйÑи в ÑкÑÑÑенном ÑлÑÑае, когда бÑл завеÑÑÑн Ñам postgres.
Ðогда ÑабоÑий пÑоÑеÑÑ ÑегиÑÑÑиÑÑеÑÑÑ ÑÑнкÑией RegisterDynamicBackgroundWorker, обÑлÑживаÑÑий пÑоÑеÑÑ, пÑоизводÑÑий ÑÑÑ ÑегиÑÑÑаÑиÑ, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑоÑÑоÑнии поÑождÑнного пÑоÑеÑÑа. ÐбÑлÑживаÑÑие пÑоÑеÑÑÑ, желаÑÑие ÑделаÑÑ ÑÑо, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÐµÑедаÑÑ Ð°Ð´ÑÐµÑ BackgroundWorkerHandle * во вÑоÑом аÑгÑменÑе RegisterDynamicBackgroundWorker. ÐÑли ÑабоÑий пÑоÑеÑÑ ÑÑпеÑно заÑегиÑÑÑиÑован, по ÑÑÐ¾Ð¼Ñ Ð°Ð´ÑеÑÑ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸Ñан ÑказаÑÐµÐ»Ñ Ð½Ð° ÑкÑÑÑÑÑ ÑÑÑÑкÑÑÑÑ, коÑоÑÑй можно заÑем пеÑедаÑÑ ÑÑнкÑии GetBackgroundWorkerPid( или BackgroundWorkerHandle *, pid_t *)TerminateBackgroundWorker(. ÐÑзÑÐ²Ð°Ñ BackgroundWorkerHandle *)GetBackgroundWorkerPid, можно опÑаÑиваÑÑ ÑоÑÑоÑние ÑабоÑего пÑоÑеÑÑа: знаÑение ÑезÑлÑÑаÑа BGWH_NOT_YET_STARTED показÑваеÑ, ÑÑо ÑабоÑий пÑоÑеÑÑ ÐµÑÑ Ð½Ðµ запÑÑен ÑпÑавлÑÑÑим; BGWH_STOPPED показÑваеÑ, ÑÑо он бÑл запÑÑен, но ÑейÑÐ°Ñ Ð½Ðµ ÑабоÑаеÑ; и BGWH_STARTED показÑваеÑ, ÑÑо он ÑабоÑÐ°ÐµÑ Ð² даннÑй моменÑ. РпоÑледнем ÑлÑÑае ÑеÑез вÑоÑой аÑгÑÐ¼ÐµÐ½Ñ Ñакже возвÑаÑаеÑÑÑ PID ÑÑого пÑоÑеÑÑа. ÐбÑабаÑÑÐ²Ð°Ñ Ð²Ñзов TerminateBackgroundWorker, ÑпÑавлÑÑÑий пÑоÑеÑÑ Ð¿Ð¾ÑÑÐ»Ð°ÐµÑ SIGTERM ÑабоÑÐµÐ¼Ñ Ð¿ÑоÑеÑÑÑ, еÑли он ÑабоÑаеÑ, и пеÑеÑÑаÑÑ ÐµÐ³Ð¾ конÑÑолиÑоваÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾ его завеÑÑении.
РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
пÑоÑеÑÑÑ, ÑегиÑÑÑиÑÑÑÑÐµÐ¼Ñ ÑабоÑий пÑоÑеÑÑ, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð´Ð¾Ð¶Ð´Ð°ÑÑÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑÑка ÑÑого пÑоÑеÑÑа. ÐÑо можно ÑеализоваÑÑ, запиÑав в bgw_notify_pid знаÑение MyProcPid, а заÑем пеÑедав ÑказаÑÐµÐ»Ñ BackgroundWorkerHandle *, полÑÑеннÑй во вÑÐµÐ¼Ñ ÑегиÑÑÑаÑии, ÑÑнкÑии WaitForBackgroundWorkerStartup(. ÐÑа ÑÑнкÑÐ¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑÑÐµÑ Ð²Ñполнение, пока ÑпÑавлÑÑÑий пÑоÑеÑÑ Ð½Ðµ попÑÑаеÑÑÑ Ð·Ð°Ð¿ÑÑÑиÑÑ ÑабоÑий пÑоÑеÑÑ, либо пока Ñам ÑпÑавлÑÑÑий пÑоÑеÑÑ Ð½Ðµ завеÑÑиÑÑÑ. ÐÑли ÑабоÑий пÑоÑеÑÑ Ð·Ð°Ð¿ÑÑен, возвÑаÑаеÑÑÑ Ð·Ð½Ð°Ñение BackgroundWorkerHandle *handle, pid_t *)BGWH_STARTED и по пеÑÐµÐ´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð°Ð´ÑеÑÑ Ð·Ð°Ð¿Ð¸ÑÑваеÑÑÑ PID. РпÑоÑивном ÑлÑÑае возвÑаÑаеÑÑÑ BGWH_STOPPED или BGWH_POSTMASTER_DIED.
ÐÑоÑеÑÑ Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑабоÑего пÑоÑеÑÑа, вÑзвав ÑÑнкÑÐ¸Ñ WaitForBackgroundWorkerShutdown( Ñ ÑказаÑелем BackgroundWorkerHandle *handle)BackgroundWorkerHandle *, полÑÑеннÑм пÑи ÑегиÑÑÑаÑии. ÐÑа ÑÑнкÑÐ¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑÑÐµÑ Ð²Ñполнение, пока не завеÑÑиÑÑÑ ÑабоÑий пÑоÑеÑÑ Ð»Ð¸Ð±Ð¾ ÑпÑавлÑÑÑий пÑоÑеÑÑ. ÐÑи завеÑÑении ÑабоÑего пÑоÑеÑÑа ÑÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ BGWH_STOPPED, а пÑи завеÑÑении ÑпÑавлÑÑÑего â BGWH_POSTMASTER_DIED.
РабоÑие пÑоÑеÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÐµÑедаваÑÑ Ð°ÑинÑ
ÑоннÑе ÑведомлениÑ, вÑзÑÐ²Ð°Ñ Ð»Ð¸Ð±Ð¾ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ NOTIFY ÑеÑез SPI (Server Programming Interface, ÐнÑеÑÑÐµÐ¹Ñ Ð¿ÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑеÑвеÑа), либо ÑÑнкÑÐ¸Ñ Async_Notify() напÑÑмÑÑ. Такие ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð¾ÑпÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑикÑаÑии ÑÑанзакÑии. ФоновÑе ÑабоÑие пÑоÑеÑÑÑ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑегиÑÑÑиÑоваÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ LISTEN Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð°ÑинÑ
ÑоннÑÑ
Ñведомлений, Ð²Ð²Ð¸Ð´Ñ Ð¾ÑÑÑÑÑÑÐ²Ð¸Ñ Ð¸Ð½ÑÑаÑÑÑкÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑакиÑ
Ñведомлений ÑабоÑим пÑоÑеÑÑом.
ÐакÑималÑное ÑиÑло ÑабоÑÐ¸Ñ Ð¿ÑоÑеÑÑов, коÑоÑÑе можно заÑегиÑÑÑиÑоваÑÑ, огÑаниÑиваеÑÑÑ Ð·Ð½Ð°Ñением max_worker_processes.