LINUX.ORG.RU

Непятничный вопрос о тредах и шедулинге

 ,


0

2

В общем я продолжаю бороться с мельницамитредами. Опять все переписано, опять код мне нравится (теперь еще больше :) ). Да еще и task'и выполняются в тредах. Тоесть все должно быть супербыстро :)

Но есть одно «но». Есть task'и, которые можна выполнять только если все его task'и-зависимости выполнены. Сейчас я делаю так: по окончанию поточного task'а перезапускаю все task'и, которые зависят от него. Все вроде ок, но в 1 случае(запуске) из ~9 я получаю облом

vv@vv-Latitude-E5520 /dev/shm/portage-cache-20121109-130326-UTC $ grep 'd inserts' *
001_architectures.log:[2012-11-09 15:03:26]  INFO: Faileddddd inserts: 0
002_platforms.log:[2012-11-09 15:03:26]  INFO: Faileddddd inserts: 0
003_arches.log:[2012-11-09 15:03:27]  INFO: Faileddddd inserts: 0
004_keywords.log:[2012-11-09 15:03:26]  INFO: Faileddddd inserts: 0
005_profile_statuses.log:[2012-11-09 15:03:26]  INFO: Faileddddd inserts: 0
006_profiles.log:[2012-11-09 15:03:27]  INFO: Faileddddd inserts: 153 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE
007_mask_states.log:[2012-11-09 15:03:26]  INFO: Faileddddd inserts: 0
008_sources.log:[2012-11-09 15:03:26]  INFO: Faileddddd inserts: 0
009_eapis.log:[2012-11-09 15:03:27]  INFO: Faileddddd inserts: 0
010_content_item_types.log:[2012-11-09 15:03:26]  INFO: Faileddddd inserts: 0
011_switches.log:[2012-11-09 15:03:26]  INFO: Faileddddd inserts: 0
021_repositories.log:[2012-11-09 15:03:26]  INFO: Faileddddd inserts: 0
031_categories.log:[2012-11-09 15:03:27]  INFO: Faileddddd inserts: 0
041_packages.log:[2012-11-09 15:03:27]  INFO: Faileddddd inserts: 0
vv@vv-Latitude-E5520 /dev/shm/portage-cache-20121109-130326-UTC $ 

Правильно ли понимаю что мне в данном случае должно помочь выставление приоритета для тредов? То есть нужно построить граф зависимостей, расставить приоритеты (чем «важнее» зачада - тем больше приоритет) для задач и запускать тред с task'ом с соотвествующим приоритетом. Может есть какая то либа для сего чтобы не плодить велосипеды? У меня сейчас зависимость задается в лоб

Всяческие идеи и напутствия приветствуются

★★★★★

Но есть одно «но». Есть task'и, которые можна выполнять только если все его task'и-зависимости выполнены.

Э... Ты пытаешься изобрести синхронизацию семафорами?

geekless ★★ ()
Последнее исправление: geekless (всего исправлений: 1)
Ответ на: комментарий от vertexua

ConditionalVariable нагугливается по твоему запросу. Это же не семафор, а мьютекс. Семафор содержит число внутри, например 5

ок. отсюда

Mutex implements a simple semaphore that can be used to coordinate access to shared data from multiple concurrent threads.

Пример отсюда

require 'thread'

mutex = Mutex.new
resource = ConditionVariable.new

a = Thread.new {
  mutex.synchronize {
    # Thread 'a' now needs the resource
    resource.wait(mutex)
    # 'a' can now have the resource
  }
}

b = Thread.new {
  mutex.synchronize {
    # Thread 'b' has finished using the resource
    resource.signal
  }
}

я так и не понял как мне поможет ваш семафор (или рубишный мьютекс)?

ZuBB ★★★★★ ()
Последнее исправление: ZuBB (всего исправлений: 1)

Семафоры, мютексы, даже условные переменные - это всё говно. Только пчелы^Wканалы в духе CSP рулят. Или, на крайний случай, очереди (да, я знаю, что там внутри мютексы). Т.е. в псевдокоде:


def task1(q):
  # чотоделаем
  q.send(msg)


def task2(q):
  # чотоделаем
  q.send(msg)

def task3(q1, q2):
  msg1, msg2 = q1.recv(), q2.recv()
  # чотоделаем


q1, q2 = Queue(), Queue()
spawn(task1, (q1,))
spawn(task2, (q2,))
spawn(task3, (q1, q2))

tailgunner ★★★★★ ()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от vertexua

если вырвать фразу

Ищите что-то со счетчиком в ruby

из контекста то получается .. елегантные шортылюбая Int переменная. так что говорите искать?

ZuBB ★★★★★ ()
Ответ на: комментарий от ZuBB

Семафор в терминах computer science, имплементацию для руби. Сам погуглил, похоже все печально, люди на форумы в виде текстовиков выкладывают велосипеды.

vertexua ★★★★★ ()
Ответ на: комментарий от vertexua

Не найдешь, напиши тоже велосипед. Описаний алгоритма много. Или возьми у них

vertexua ★★★★★ ()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от ZuBB

Да они должны быть встроенные. В Python есть - значит, и у вас должны быть.

tailgunner ★★★★★ ()
Ответ на: комментарий от st4l1k

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

ZuBB ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.