Да, такое возможно, если падение процесса совпало с рестартом машины. Можно добавить в ключ время запуска процесса (просто вызвав time() при запуске и сохранив его где-нибудь).<div><br></div><div>В других случаях pid будет назначен иной с очень большой вероятностью (<span style="font-family:'Times New Roman',serif;font-size:16px;text-align:justify;background-color:rgb(255,255,255)">PID генерируются функцией </span><tt style="font-size:16px;font-weight:bold;font-family:'Courier New',monospace;text-align:justify;background-color:rgb(255,255,255)">get_pid</tt><span style="font-family:'Times New Roman',serif;font-size:16px;text-align:justify;background-color:rgb(255,255,255)">, которая возвращает еще не используемый PID. В качестве начального эта функция использует </span><tt style="font-size:16px;font-weight:bold;font-family:'Courier New',monospace;text-align:justify;background-color:rgb(255,255,255)">last_pid</tt><span style="font-family:'Times New Roman',serif;font-size:16px;text-align:justify;background-color:rgb(255,255,255)"> </span><span style="font-family:'Times New Roman',serif;font-size:16px;text-align:justify;background-color:rgb(255,255,255)"> — последний выделенный PID).</span><br>
<br><div class="gmail_quote">6 августа 2012 г., 14:07 пользователь Alexandr Alexeev <span dir="ltr"><<a href="mailto:afiskon@gmail.com" target="_blank">afiskon@gmail.com</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
>> SELECT ... FOR UPDATE;<br>
<br>
Это очень похоже на то, что мне нужно<br>
<div class="im"><br>
>> В MySQL есть GET_LOCK(name), RELEASE_LOCK(name) которые не привязаны к<br>
таблице, и удаляются при потере соединения.<br>
<br>
</div>А насколько это переносимо под другие РСУБД?<br>
<div class="im"><br>
>> Все воркеры запускаются под супервизором (runit), и при старте он проверяет очередь на задачи, маркированные тем же ip, но другим pid, и снимает с них пометку.<br>
<br>
</div>А если при следующем запуске процесс получит тот же pid?<br>
<br>
6 августа 2012 г., 13:54 пользователь Akzhan Abdulin<br>
<<a href="mailto:akzhan.abdulin@gmail.com">akzhan.abdulin@gmail.com</a>> написал:<br>
<div class="HOEnZb"><div class="h5">> Ну это лечилось тривиально.<br>
><br>
> Все воркеры запускаются под супервизором (runit), и при старте он проверяет<br>
> очередь на задачи, маркированные тем же ip, но другим pid, и снимает с них<br>
> пометку.<br>
><br>
> 6 августа 2012 г., 13:42 пользователь Sergey Leschenko <<a href="mailto:sergle.ua@gmail.com">sergle.ua@gmail.com</a>><br>
> написал:<br>
><br>
>> > Сначала делал UPDATE таблицы, а потом выбирал нужные записи.<br>
>><br>
>> Минус этого варианта в том, что если worker умрет, надо вернуть задачи<br>
>> обратно в очередь.<br>
>><br>
>> В MySQL есть GET_LOCK(name), RELEASE_LOCK(name) которые не привязаны к<br>
>> таблице, и удаляются при потере соединения.<br>
>> Читаем задачу, формируем имя лока, пробуем залочить - получилось -<br>
>> выполняем, не получилось - переходим к следующей задаче.<br>
>><br>
>> --<br>
>> Sergey<br>
>> --<br>
>> Moscow.pm mailing list<br>
>> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
><br>
><br>
><br>
> --<br>
> Moscow.pm mailing list<br>
> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
><br>
<br>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
С уважением, Александр<br>
Личный блог: <a href="http://eax.me/" target="_blank">http://eax.me/</a><br>
Мой форум: <a href="http://it-talk.org/" target="_blank">http://it-talk.org/</a><br>
Мой Twitter: <a href="http://twitter.com/afiskon" target="_blank">http://twitter.com/afiskon</a><br>
</font></span><div class="HOEnZb"><div class="h5">--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br></div>