Hello together!
I would like to combine data from different python programs via zeromq. I think for that job the best solution would be parallel pipelines as are described in this example at the ponit "3. Parallel Pipeline (parallel pipeline mode)".
So in the beginning I wanted to test the functionality with just very simple examples. That for I've just used the three patterns producer
, consumer
and resultcollector
that you can find on the example. I just made small changes:
Producer
import zmq
context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.bind("tcp://*:5566")
work_message = "start working"
socket.send_json(work_message)
Consumer_1
import random
import zmq
context = zmq.Context()
consumer_id = 199
#receiving work
consumer_receiver = context.socket(zmq.PULL)
consumer_receiver.connect("tcp://localhost:5566")
#forewarding results
consumer_sender = context.socket(zmq.PUSH)
consumer_sender.bind("tcp://*:5500")
msg = consumer_receiver.recv_json()
for i in (0, 100):
if msg == "start working":
data = "id: " + str(consumer_id) + "; Hello"
consumer_sender.send_json(data)
Result Collector
#coding:utf-8
import zmq
context = zmq.Context()
result_receiver = context.socket(zmq.PULL)
result_receiver.connect("tcp://localhost:5599")
result = result_receiver.recv_json()
collected_data = []
for i in (0, 10000):
collected_data.append(result)
print(collected_data)
So the main communication between them is working. But now I've tried to add another consumer (worker) who delivers data. It should be possible, as you can see in the example I've linked. Here you can see my second consumer (worker):
Consumer_2
import random
import zmq
context = zmq.Context()
consumer_id = 10
#receiving work
consumer_receiver = context.socket(zmq.PULL)
consumer_receiver.connect("tcp://localhost:5566")
#forewarding results
consumer_sender = context.socket(zmq.PUSH)
consumer_sender.bind("tcp://*:5599")
msg = consumer_receiver.recv_json()
for i in (0, 100):
if msg == "start working":
data = "id: " + str(consumer_id) + "; World"
consumer_sender.send_json(data)
It's pretty much the same as consumer_1. But when I want to run both consumers i get the error message "ZMQError: Adress in use":
---------------------------------------------------------------------------
ZMQError Traceback (most recent call last)
<ipython-input-1-af8297fe1137> in <module>
12 #forewarding results
13 consumer_sender = context.socket(zmq.PUSH)
---> 14 consumer_sender.bind("tcp://*:5599")
15
16 msg = consumer_receiver.recv_json()
~\Anaconda3\lib\site-packages\zmq\sugar\socket.py in bind(self, addr)
171
172 """
--> 173 super().bind(addr)
174 return self._bind_cm(addr)
175
zmq/backend/cython/socket.pyx in zmq.backend.cython.socket.Socket.bind()
~\Anaconda3\lib\site-packages\zmq\backend\cython\checkrc.pxd in zmq.backend.cython.checkrc._check_rc()
ZMQError: Address in use
Where is my fault? It has to be possible to push with different programms to a single port (as in the example port 5599) or am I wrong? I am pretty new to programming at all so sorry if you think that this is a stupid question.
It would be very nice if you guys could help me out here.
Thanks a lot!