2010-12-08 5 views
1

Конечно, существует очевидный способ использования «синхронизированного». Но я создаю систему, предназначенную для работы на нескольких ядрах и записывая в этот файл разное время в тот же самый milisecond. Так что я считаю, что использование синхронизации сильно ухудшит производительность. Я думал о том, чтобы использовать класс Pipe java (но не уверен, поможет ли он) или каждый поток записывает в другой файл и дополнительную нить собираетэти записи, создавая окончательный результат. Я должен упомянуть, что порядок работ не важен, и в любом случае это наносят врем . Какова лучшая идея этих двух? есть какие-то другие предложения? спасибо.Синхронизация нескольких потоков, записывающих в один и тот же файл в java

+0

Необходимо указать, какую скорость вы используете, пропускную способность или задержку. Вам нужно написать 10 тыс. М/с или любое сообщение в 1 мс? Также, если вы заботитесь о надежности записи на диск (можете ли вы позволить себе потерять задержанные записи при сбое процесса). – DaveC 2010-12-11 03:03:37

ответ

2

Использование некоторой синхронизации (например, отдельных мьютексов) довольно просто реализовать.

Если бы у меня было достаточно ОЗУ, я создавал бы какую-то очередь для каждого журнала-продюсера и поток журналов-потребителей, чтобы читать из всех очередей круговым способом (или что-то в этом роде) ,

1

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

1

Вы правы, что вы не сможете записывать все потоки в один и тот же файл без проблем с производительностью.

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

Для других идей вы можете проверить, как работают логисты, такие как Log4j и Logback, им пришлось бы решить эту проблему.

1

Попробуйте использовать JMS. Все ваши процессы, запущенные на разных машинах, могут отправлять JMS-сообщение вместо записи в файл. Создайте только один приемник очереди, который получает сообщения и записывает их в файл. Log4J уже имеет эту функцию: см. JMSAppender.