Я имею дело с распределенной ситуацией «тупика» в одноранговой системе связи (написанной и запущенной на Python 3.5). В этой системе каждый узел поддерживает 2 так называемых inconn и outconn связи с каждым из своих сверстников. Я использую select.poll() для выполнения мультиплексирования. Поэтому иногда может произойти следующий тупик: если два подключенных партнера, пытающихся отправить их другому через outconn, цикл select.poll() каждого однорангового узла блокирует send(), и поэтому другая сторона не может recv() на inconn подключение.send() через блокирующий сокет вышло из строя, но сообщение прибыло в пункт назначения после этого
Способ, которым я управляю этим тупиком, заключается в установке() на разъеме outconnn, который кажется рабочим. Тем не менее, интересно, что сообщение, похоже, может прибыть в пункт назначения после истечения времени ожидания сокета. Вот пример бревна двух узлов:
Узел (192.168.56.109)
INFO: [2016-11-02 11:08:05,172] [COOP] Sending ASK_COOP [2016-11-02 11:08:05.172643] to 192.168.56.110 for segment 2.
WARNING: [2016-11-02 11:08:06,173] [COOP] Cannot send to 192.168.56.110. Error: timed out
INFO: [2016-11-02 11:08:06,174] [COOP] Message from 192.168.56.110 is available on 10.
INFO: [2016-11-02 11:08:06,174] [COOP] Get HEARTBEAT [2016-11-02 11:08:04.503723] from 192.168.56.110 for segment 2.
Node B (192.168.56.110)
INFO: [2016-11-02 11:08:04,503] [COOP] Sending HEARTBEAT [2016-11-02 11:08:04.503723] to 192.168.56.109 for segment 2.
WARNING: [2016-11-02 11:08:05,505] [COOP] Cannot send to 192.168.56.109. Error: timed out
INFO: [2016-11-02 11:08:05,505] [COOP] Message from 192.168.56.109 is available on 11.
INFO: [2016-11-02 11:08:05,505] [COOP] Get ASK_COOP [2016-11-02 11:08:05.172643] from 192.168.56.109 for segment 2.
Могу ли я узнать, почему в том, что? И, кстати, мой способ справиться с таким тупиком - хорошая практика? Если нет, то какова наилучшая практика, чтобы избежать такого распределенного тупика?