Многопроцессорная обработка Python простой способ реализовать простой счетчик?

Можно использовать подзапрос для этого как

select *
from  
( select * 
  from emp 
  order by sal desc ) 
where ROWNUM <= 5;

, Имеют также взгляд на тему На ROWNUM и ограничивающих результатах в Oracle/AskTom для получения дополнительной информации.

Обновление : Для ограничения результата и с вещами нижних и с верхних границ становятся более чрезмерно увеличенными в размерах с

select * from 
( select a.*, ROWNUM rnum from 
  (  ) a 
  where ROWNUM <= :MAX_ROW_TO_FETCH )
where rnum  >= :MIN_ROW_TO_FETCH;

(Скопированный с указанной AskTom-статьи)

Обновление 2 : Запуск с Oracle 12c (12.1) существует синтаксис, доступный, чтобы ограничить строки или запуститься при смещениях.

SELECT * 
FROM   sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

См. этот ответ для большего количества примеров. Благодаря Krumia для подсказки.

9
задан 5 August 2009 в 13:19
поделиться

1 ответ

Значение действительно изменяемое; вы указываете нужный тип данных в модуле ctypes , а затем его можно изменять. Вот полный рабочий сценарий, демонстрирующий это:

from time import sleep
from ctypes import c_int
from multiprocessing import Value, Lock, Process

counter = Value(c_int)  # defaults to 0
counter_lock = Lock()
def increment():
    with counter_lock:
        counter.value += 1

def do_something():
    print("I'm a separate process!")
    increment()

Process(target=do_something).start()
sleep(1)
print counter.value   # prints 1, because Value is shared and mutable

РЕДАКТИРОВАТЬ: Люпер правильно указывает в комментарии ниже, что значения Value заблокированы по умолчанию. Это правильно в том смысле, что даже если присвоение состоит из нескольких операций (например, присвоение строки, которая может состоять из многих символов), то это присвоение является атомарным. Однако при увеличении счетчика вам все равно потребуется внешняя блокировка, как показано в моем примере, поскольку при увеличении загружается текущее значение, а затем оно увеличивается, а затем присваивается результат обратно Value .

Итак без внешнего замка, вы можете столкнуться со следующим обстоятельством:

  • Процесс 1 считывает (атомарно) текущее значение счетчика, затем увеличивает его
  • до того, как Процесс 1 сможет присвоить увеличенному счетчику обратно значение Value , a происходит переключение контекста
  • Процесс 2 считывает (атомарно) текущее (неувеличенное) значение счетчика, увеличивает его и присваивает увеличенный результат (атомарно) обратно Value
  • Процесс 1 присваивает свое увеличенное значение (атомарно ), отбрасывая приращение, выполняемое процессом 2
24
ответ дан 4 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

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