|
|
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
Возьмём ArrayBlockingQueue и LinkedBlockingQueue. Самая важная разница в контексте моего вопроса в том, что первая очередь ограниченная. ArrayBlockingQueue конструктор имеет параметр fair. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. и тут есть параметр fair, который имеет тот же смыл, что и в ReentrantLock Я так понимаю он имеет смысл в двух случаях. 1. Допустим мы сейчас добавляем элемент в очередь и пока мы это делаем прилетело ещё 2 элемента на добавление, и тут на второе место в очереди может попасть как первый, так и второй из конкурирующих потоков в очереди. 2. В случае переполнения очереди потоки выстраиваются либо в очередь(в случае fair) либо порядок захвата очереди неопределен Судя по имплементации LinkedBlockingQueue тут есть такая же проблема: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Теперь собственно о вопросе: В concurrency in practice написано следующее: poison pill техника почему-то будет работать только на неограниченных очередях. Я не понял почему. Также я не понял как использовать эту технику когда много consumer-ов и producer-ов Пример использования этой техники из книги: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:07 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
questionerpoison pill техника почему-то будет работать только на неограниченных очередях. Я не понял почему. По-моему у тебя опять трудности перевода. Приводил бы что ли оригинальные цитаты. Ну, и проблема с использованием poison pill в bounded queue в том что очередь может быть заполнена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:20 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
questionerТакже я не понял как использовать эту технику когда много consumer-ов и producer-ов Конкретизируй что именно не понятно? Очередь же одна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:22 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczquestionerpoison pill техника почему-то будет работать только на неограниченных очередях. Я не понял почему. По-моему у тебя опять трудности перевода. Приводил бы что ли оригинальные цитаты. Ну, и проблема с использованием poison pill в bounded queue в том что очередь может быть заполнена. А чем нам мешает тот факт, что она заполнена? по поводу цитаты: авторPoison pills work reliably only with unbound queues. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:28 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczquestionerТакже я не понял как использовать эту технику когда много consumer-ов и producer-ов Конкретизируй что именно не понятно? Очередь же одна. когда один consumer и один producer producer шлёт ядовитое сообщение в очередь. как только consumer его получил - закрываем лавочку. когда много producer-ов и один consumer Каждый producer шлёт ядовитое сообщение в очередь. как только consumer получил сообщение столько, сколько producer-ов - закрываем лавочку. как быть если много producer-ов и consumer -ов ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:35 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
Очепятка авторКаждый producer шлёт ядовитое сообщение в очередь. как только consumer получил сообщение столько, сколько producer-ов - закрываем лавочку. Каждый producer шлёт ядовитое сообщение в очередь. как только consumer получил сообщений столько, сколько producer-ов - закрываем лавочку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:36 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
questionerА чем нам мешает тот факт, что она заполнена? Тем что в ней нет места для poison pill. questionerавторPoison pills work reliably only with unbound queues. Вот именно reliably ты из своего перевода почему-то выкинул. Речь, ведь, не о том что не будет работать совсем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:40 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
questionerкак быть если много producer-ов и consumer -ов ? Считаешь и тех и других. Последний разгребатель разгребает все. Остальные перед уходом возвращают пилюлю в очередь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:44 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczquestionerА чем нам мешает тот факт, что она заполнена? Тем что в ней нет места для poison pill. Места нет - заблокируемся ведь до появления этого самого места, когда consumer разгребется. BlazkowiczВот именно reliably ты из своего перевода почему-то выкинул. Речь, ведь, не о том что не будет работать совсем. Да, ок, я подразумевал, что должно корректно "всегда", а этого не обещают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:52 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевquestionerкак быть если много producer-ов и consumer -ов ? Считаешь и тех и других. Последний разгребатель разгребает все. Остальные перед уходом возвращают пилюлю в очередь. а как последний понимает, что он последний? Можно пример? пусть у нас 3 продюсера и 2 консумера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:55 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, questioner Места нет - заблокируемся ведь до появления этого самого места, когда consumer разгребется. Место появилось и сообщение таки в очередь проберется. и таки до консумера долетит. Если используем fair, то и даже в нужном порядке долетит. Хотят смотрю в LinkedBlockingQueue используется обычный не fair ReentrantLock и там даже не предлагают этот параметр выставлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:58 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
questionerМеста нет - заблокируемся ведь до появления этого самого места, когда consumer разгребется. В приведенном коде он отваливал по первой пилюле. А хвост никто не разгребал. Могло оказаться так, что хвост бы оставался. Как ты заметил нужен счетчик пилюль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 16:59 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевquestionerМеста нет - заблокируемся ведь до появления этого самого места, когда consumer разгребется. В приведенном коде он отваливал по первой пилюле. А хвост никто не разгребал. Могло оказаться так, что хвост бы оставался. Как ты заметил нужен счетчик пилюль. пример для варианта, что один консумер и один продюсер, поэтому и не надо ничего разгребать. аааааа, кажется вкурил. Проблема в том, что несколько сигналов на остановку могут быть посланы разными потоками(хотя и одним тоже может)? первый сигнал обработается, консумер остановится, а если при добавлении второго он заблочится, то он так и останется висеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 17:03 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
Задача в общем то проста. В очереди посылается сигнал о том, что надо отвалится. Разгребатель отваливает. Если очередь не ограничена, то все уходят и оставляют мусор в очереди. Если очередь ограничена, то может сложиться ситуация, что разгребатель отвалил, а желающих набросать мусор еще навалом (ну их больше одного). Но мусорный бак переполнен. И все они будут ждать, пока разгребатель вернется, а он этого никогда не сделает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 17:28 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевЗадача в общем то проста. В очереди посылается сигнал о том, что надо отвалится. Разгребатель отваливает. Если очередь не ограничена, то все уходят и оставляют мусор в очереди. Если очередь ограничена, то может сложиться ситуация, что разгребатель отвалил, а желающих набросать мусор еще навалом (ну их больше одного). Но мусорный бак переполнен. И все они будут ждать, пока разгребатель вернется, а он этого никогда не сделает. В примере из книги если у нас много загребателей и всего один разгребатель, то каждый загребатель шлёт сигнал и наш любимый разгребатель считает количество этих сигналов. Как только количество сигналов равно количеству загребателей, разгребатель может угомониться. Но это не очень похоже на Ваш вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 18:05 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
в книге пишут, чтобы каждый продюсер положил в очередь столько ядовитых сообщение сколько у нас разгребателей. Но детали не уточнены ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 18:13 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Я подумал, может я что-то очевидное не понимаю. написал небольшой тестик: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. выводит авторput 1 Took 1 put 2 Не понятно в чем проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 18:36 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
questionerв книге пишут, чтобы каждый продюсер положил в очередь столько ядовитых сообщение сколько у нас разгребателей. Но детали не уточнены Ну это следующий шаг. Но положим, что загребателей 101, а разгребателей 10. Это означает, что появится желание накидать 1010 пилюль. если случится гонка, то между ними влезут и не пилюли. А тпеперь финт ушами. Все разгребатели съели пилюли от первого загребателя. Вопрос сможет ли последний загребатель накидать все пилюли в очередь на 1000 элементов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 19:23 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
questioner, Проблем как раз таки нет, queue.put(2) ждет когда освободится место в очереди (1) для вставки, а это происходит после queue.take(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 20:38 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
no56892, ну дак и я про то же. как по мне это не отличается от того, что в книге написано, но видимо Goetz что-то другое думал, когда писал этот пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 22:25 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевquestionerв книге пишут, чтобы каждый продюсер положил в очередь столько ядовитых сообщение сколько у нас разгребателей. Но детали не уточнены Ну это следующий шаг. Но положим, что загребателей 101, а разгребателей 10. Это означает, что появится желание накидать 1010 пилюль. если случится гонка, то между ними влезут и не пилюли. А тпеперь финт ушами. Все разгребатели съели пилюли от первого загребателя. Вопрос сможет ли последний загребатель накидать все пилюли в очередь на 1000 элементов? не сможет... но это Вы к чему, я не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 22:27 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
к тому же там не написано, что этот подход не работает, только для варианта когда разгребателей много. В самом простом случае 1 загребатель и 1 разгребатель на какой очереди тут будет проблема? ну может на 2 загребателях, если на одном ни как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 22:41 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
На самом деле использования терминирующей таблетки очевидно недостаток дизайна система. В рабочих системах используется для этого модель не производитель/потребитель, а издатель/подписчик. Достаточно опубликовать одно сообщение чтоб группа подписчиков свернула свою потребительскую деятельность. Раздовать каждому по таблетке это ГОСПЛАН какой-то если кто помнит как это было в эпоху развитого социализма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 23:00 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
questionerне сможет... но это Вы к чему, я не понял. К вопросу чем может помешать конечность очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 09:32 |
|
||
|
Почему poison pill не будет работать для bounded очередей?
|
|||
|---|---|---|---|
|
#18+
SergunkaДостаточно опубликовать одно сообщение чтоб группа подписчиков свернула свою потребительскую деятельность. Вы шину то с очередью не путаете? Из очереди может прочитать только один. Соответственно надо гарантировать, что прочтут все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 09:44 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39408703&tid=2123112]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
95ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
92ms |
get tp. blocked users: |
2ms |
| others: | 251ms |
| total: | 498ms |

| 0 / 0 |
