Подсказка компилятора: “Подставляемая функция' …' не была расширена …”

Если вам нужно мгновенное убийство, вы можете использовать multiprocessing.Event, чтобы сообщить родительскому процессу о выполненном условии и позволить ему немедленно уничтожить рабочие процессы. Процесс менеджера был бы слишком тяжелым для такой небольшой синхронизации.

import os
from datetime import datetime
from multiprocessing import Process, Event


def worker(range_, target, found_event):
    print('{} | pid: {} started'.format(datetime.now(), os.getpid()))
    for x in range_:
        if x == target:
            print('{} | pid: {} found target'.format(
                datetime.now(), os.getpid())
            )
            found_event.set()


if __name__ == "__main__":

    N_WORKERS = 4

    step = int(200e6)
    ranges = [range(x, x + step) # change `range` to `xrange` for Python 2
              for x in range(0, N_WORKERS * step, step)]
    # range(0, 200000000), ..., range(800000000, 1000000000)]
    target = int(150e6)  # <-- worker finding this value triggers massacre
    found_event = Event()

    pool = [Process(target=worker, args=(range_, target, found_event))
            for range_ in ranges]

    for p in pool:
        p.start()

    found_event.wait()  # <- blocks until condition met
    print('{} | terminating processes'.format(datetime.now()))
    for p in pool:
        p.terminate()
    for p in pool:
        p.join()
    print('{} | all processes joined'.format(datetime.now()))

Пример вывода:

2019-01-17 01:55:33.781884 | pid: 28376 started
2019-01-17 01:55:33.782333 | pid: 28377 started
2019-01-17 01:55:33.782851 | pid: 28378 started
2019-01-17 01:55:33.783484 | pid: 28379 started
2019-01-17 01:55:54.715425 | pid: 28376 found target
2019-01-17 01:55:54.715613 | terminating processes
2019-01-17 01:55:54.716326 | all processes joined

Process finished with exit code 0
15
задан naXa 6 May 2014 в 18:50
поделиться

3 ответа

Это - ограничение встраивания.

См. статью Hallvard Vassbotn приблизительно Встроенные Стандартные программы .

Извлеченный из того сайта:

Остальная часть ограничений встраивания характерна для обеих платформ, и самые важные -

  • никакое встраивание через границы пакета
  • , встроенная стандартная программа не может получить доступ к идентификаторам раздела реализации
  • , сайт вызова должен иметь доступ ко всем идентификаторам, используемым во встроенной стандартной программе

Примечание , последняя точка означает, что, если единица сайта вызова не использует единицы, требуемые стандартной программой, стандартная программа не может быть встроена. Когда это происходит, компилятор испускает подсказку как это

 [Pascal Hint] InlinedRoutinesU.pas(14): H2443 Inline function 
   'InlineMe' has not been expanded because unit 'RequiredUnit' 
    is not specified in USES list 

Для решения вопроса, добавьте недостающее имя единицы к пункту использования сайта вызова.

24
ответ дан 1 December 2019 в 00:37
поделиться

Подставляемые функции могут быть расширены встроенные. Например:

function AddPlus(const A,B: Integer): Integer; inline;
begin
  Result := A + B + 1;
end;

var
  x,y,z : Integer;
begin
  y := 22;
  z := 11;
  x := AddPlus(y, z);
end.

переписывается к:

var
  x,y,z : Integer;
begin
  y := 22;
  z := 11;
  x := y+z+1;
end.

Это удаляет издержки вызова функции.

, Но для замены вызова телом функции, для компилятора нужно больше информации, следовательно жалоба на единицу.

Остерегаются этого не, все подставляемые функции преобразовываются. Некоторых рассматривают точно так же, как нормальные функции (до компилятора). Кроме того, встроенный только необходим в действительно трудных узких местах производительности.

12
ответ дан 1 December 2019 в 00:37
поделиться

Подставляемые функции расширены на месте компилятором, избежав издержек вызова функции. Например, для обработки на квадрат, площадь (x) компилируется в как x*x вместо того, чтобы вызвать функцию, которая умножает x и возвращает результат.

1
ответ дан 1 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: