Есть ли способ выйти из потока в цикле Parallel.foreach, который застрял

Я использую OmniThread Parallel.foreach(). Бывают случаи, когда цикл занимает много времени или застревает.

Я хотел бы знать, возможно ли тайм-аут каждого процесса в цикле Parallel.foreach()?


person James    schedule 22.06.2020    source источник
comment
Зависит от. Если под зависанием вы подразумеваете тупик, это другой вопрос, чем просто долгий, но все же завершенный. Что он.   -  person David Heffernan    schedule 22.06.2020
comment
@DavidHeffernan спасибо за ваш ответ. В случае, если в БД есть блокировка или ошибка, которая не позволяет продолжить работу.   -  person James    schedule 22.06.2020
comment
В этом случае единственный способ справиться с этим - поместить задачу, которая может блокироваться, в отдельный процесс и использовать IPC для связи между вашим процессом и процессом, который может блокировать. Если он блокируется, вы можете завершить процесс. Только процессы имеют достаточную изоляцию ресурсов для этого. Нити не делают.   -  person David Heffernan    schedule 22.06.2020
comment
Большинство баз данных имеют настройки времени ожидания, доступные в параметрах соединения или даже в качестве параметров кода/запроса. Существуют также варианты того, как долго ждать блокировки — часто вы даже можете получить мгновенный сбой, вместо того, чтобы ждать, чтобы попытаться получить блокировку. Например, на SQL Server с использованием Lock_Timeout с собственной логикой повтора.   -  person Brian    schedule 23.06.2020


Ответы (1)


Короче: нет.

Если вы не запрограммируете обработку тайм-аута в своем коде «тела потока» (то, что вызывается при выполнении).

например, мой механизм базы данных позволяет отправлять вызов CancelProcessing для выполнения запросов из другого потока, который выполняет запрос, это «чисто» завершит работающий подпоток.

'Грязный' конец подтем:

Я добавил FR на сайт Omnithread github, чтобы добавить (грязный) метод Terminate к IOmniParallel интерфейсы (и им подобные). Что имеет недостаток, потому что уничтожение подпотоков, вероятно, приведет к утечке памяти/ресурсов.

Тем временем вы можете использовать это грязное завершение работы solution/workaround, которое на самом деле устраняет аналогичную проблему (у меня был тупик в моей параллельной процедуре обработки , поэтому мой parallel.Waitfor никогда не возвращал true, и, что еще хуже, моя переменная интерфейса IOmniParallelTask никогда не освобождалась, что также приводило к блокировке вызывающего потока.

person H.Hasenack    schedule 06.07.2020