Как правильно объявить тип сокета в ZeroMQ python? - PullRequest
0 голосов
/ 26 апреля 2020

У меня странная проблема. Я разрабатываю веб-интерфейс для своего несогласного бота и использую ZeroMQ для связи между процессом бота и процессом fastAPI. Моя программа структурирована так, что процесс fastAPI отправляет ZeroMQ REQ. Мой бот разногласий действует как " сервер ", поскольку он предоставляет информацию, а процесс fastAPI действует как клиент. Этот указанный c метод пытается заставить моего разногласного бота выбрать участников онлайн и затем отправить их обратно запрашивающей стороне. Вот мой код:

На стороне сервера: (несущественные части, переданные на сжатие)

import asyncio

import zmq
import zmq.asyncio


async def openWebServerInterface():
    zmqctx = zmq.asyncio.Context()
    s = zmqctx.socket(zmq.REP)
    s.connect('tcp://127.0.0.1:1234')
    print('waiting on request...')
    request = await s.recv_string()
    if request == "gimmethedata":
        print("sending online people")
        s.send_string(await returnOnline())
    print("data request sent!")
    s.close()

async def returnOnline():
    message = "this will return my online members"
    return message

asyncio.run(openWebServerInterface())

Сторона клиента:

async def listenForResponse():
    await openBotConnection()
    print("logo interface opened!")
    r = zmqctx.socket(zmq.REP)
    print("socket connected, waiting for response")
    reply = await r.recv_string()
    print(reply)
    return reply

async def openBotConnection():
    s = zmqctx.socket(zmq.REQ)
    s.connect('tcp://127.0.0.1:1234')
    await s.send_string("gimmethedata")
    print("data request sent!")
    s.close()

@app.get("/")
async def root():
    print("listing for logo's response!")
    return await listenForResponse()

Полученное сообщение об ошибке находится на серверной программе (нет проблем с запуском "клиентской" программы). Ошибка выглядит следующим образом:

Traceback (most recent call last):
File "E:/DiscordBotContainer/ServerSideTestFile", line 23, in <module> asyncio.run(openWebServerInterface()) File "*\AppData\Local\Programs\Python\Python38\lib\asyncio\runners.py", line 43, in run return loop.run_until_complete(main) File "*\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 616, in run_until_complete return future.result () File "E:/DiscordBotContainer/fuck it", line 9, in openWebServerInterface s = zmqctx.socket(zmq.REP) File "*\AppData\Local\Programs\Python\Python38\lib\site-packages\zmq\sugar\context.py", line 204, in socket s = self._socket_class(self, socket_type, **kwargs) File "*\AppData\Local\Programs\Python\Python38\lib\site-packages\zmq\_future.py", line 144, in __init__ self._init_io_state() File "*\AppData\Local\Programs\Python\Python38\lib\site-packages\zmq\asyncio\__init__.py", line 53, in _init_io_state self.io_loop.add_reader(self._fd, lambda : self._handle_events(0, 0)) File "*\AppData\Local\Programs\Python\Python38\lib\asyncio\events.py", line 501, in add_reader raise NotImplementedError

Моя интуиция заставляет меня думать, что это проблема с объявлением сокета на стороне сервера, но У меня нет проблем с объявлением сокета с использованием точно такого же синтаксиса на стороне клиента.

1 Ответ

1 голос
/ 26 апреля 2020

Q : "Как правильно объявить тип сокета в ZeroMQ python?"

Декларация - не ваша проблема, обе стороны архетипа формального поведения REQ/REP ZeroMQ были правильно созданы с использованием метода .socket( { zmq.REP | zmq.REQ } ) с любым соответствующим типом архетипа.

Ваша проблема заключается в управлении ISO- AccessPoint Определение OSI-L3 для выбранного tcp:// Транспортного класса.

Здесь одна сторона любого из известных типов архетипов ZeroMQ имеет .bind() тогда как другой должен .connect(). Не исключение, не оправдание.

Так что заставьте любой из ваших REQ/REP Archetype сделать .bind() и позвольте другому .connect() и ваши настройки будут работать. Других условий здесь нет.


В случае, если кто-то никогда не работал с ZeroMQ,
здесь можно сначала посмотреть на "ZeroMQ Принципы в менее чем Пять секунд"
, прежде чем углубляться в детали



...