Вызовы GRPC не работают при запуске в нескольких процессах. Но может быть выполнено любое количество раз при запуске основного процесса / одного недавно порожденного процесса. Все вызовы GRPC после создания второго нового процесса завершаются неудачно.
Я устанавливаю сервер GRPC, используя future.ThreadPoolExecutor: start_server () method
some_server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
some_server_pb2_grpc.add_SomeInterfaceServicer_to_server(Server(), some_server)
# bind the server to the port defined above
some_server.add_insecure_port('[::]:{}'.format(self.server_port))
# start the server
some_server.start()
Мой код Python:
# GRPC TEST - 1 : WORKS!! Single process calling GRPC client
from grpc_module.client import Client
from multiprocessing.process import Process
from utils import send_status_info
send_status_info() # Works
def my_loop():
for i in range(10):
send_status_info()
p = Process(target=my_loop)
p.start() # Works
p.join()
Но вызовы GRPC начинают сбой, когда выполняются с несколькими процессами.
# GRPC TEST - 2 : FAILS!! Multiple process calling GRPC client
from grpc_module.client import Client
from multiprocessing.process import Process
from utils import send_status_info
send_status_info()
def my_loop():
for i in range(10):
send_status_info()
p = Process(target=my_loop)
p.start()
p.join()
p = Process(target=my_loop)
p.start()
p.join()
Связано ли это с унарной настройкой GRPC.
Если да, как я могу реализовать асинхронную GRPC здесь?
Пожалуйста, помогите.
ОБНОВЛЕНИЕ: Мои выводы - вызовы GRPC доходят до кода клиента GRPC, но не удается при соединении с сервером. При запуске этого с использованием командной строки Python, когда он застревает (как показано в методе 2), я нажимаю Ctrl + C, он заканчивается трассировкой стека следующим образом:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/multiprocessing/process.py", line 145, in join
res = self._popen.wait(timeout)
File "/usr/lib/python2.7/multiprocessing/forking.py", line 154, in wait
return self.poll(0)
File "/usr/lib/python2.7/multiprocessing/forking.py", line 135, in poll
pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt