Python zmq.SUBSCRIBE Examples
The following are 30
code examples of zmq.SUBSCRIBE().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
zmq
, or try the search function
.

Example #1
Source Project: vnpy_crypto Author: birforce File: socket.py License: MIT License | 6 votes |
def set_string(self, option, optval, encoding='utf-8'): """Set socket options with a unicode object. This is simply a wrapper for setsockopt to protect from encoding ambiguity. See the 0MQ documentation for details on specific options. Parameters ---------- option : int The name of the option to set. Can be any of: SUBSCRIBE, UNSUBSCRIBE, IDENTITY optval : unicode string (unicode on py2, str on py3) The value of the option to set. encoding : str The encoding to be used, default is utf8 """ if not isinstance(optval, unicode): raise TypeError("unicode strings only") return self.set(option, optval.encode(encoding))
Example #2
Source Project: vnpy_crypto Author: birforce File: test_socket.py License: MIT License | 6 votes |
def test_unicode_sockopts(self): """test setting/getting sockopts with unicode strings""" topic = "tést" if str is not unicode: topic = topic.decode('utf8') p,s = self.create_bound_pair(zmq.PUB, zmq.SUB) self.assertEqual(s.send_unicode, s.send_unicode) self.assertEqual(p.recv_unicode, p.recv_unicode) self.assertRaises(TypeError, s.setsockopt, zmq.SUBSCRIBE, topic) self.assertRaises(TypeError, s.setsockopt, zmq.IDENTITY, topic) s.setsockopt_unicode(zmq.IDENTITY, topic, 'utf16') self.assertRaises(TypeError, s.setsockopt, zmq.AFFINITY, topic) s.setsockopt_unicode(zmq.SUBSCRIBE, topic) self.assertRaises(TypeError, s.getsockopt_unicode, zmq.AFFINITY) self.assertRaisesErrno(zmq.EINVAL, s.getsockopt_unicode, zmq.SUBSCRIBE) identb = s.getsockopt(zmq.IDENTITY) identu = identb.decode('utf16') identu2 = s.getsockopt_unicode(zmq.IDENTITY, 'utf16') self.assertEqual(identu, identu2) time.sleep(0.1) # wait for connection/subscription p.send_unicode(topic,zmq.SNDMORE) p.send_unicode(topic*2, encoding='latin-1') self.assertEqual(topic, s.recv_unicode()) self.assertEqual(topic*2, s.recv_unicode(encoding='latin-1'))
Example #3
Source Project: vnpy_crypto Author: birforce File: test_monqueue.py License: MIT License | 6 votes |
def build_device(self, mon_sub=b"", in_prefix=b'in', out_prefix=b'out'): self.device = devices.ThreadMonitoredQueue(zmq.PAIR, zmq.PAIR, zmq.PUB, in_prefix, out_prefix) alice = self.context.socket(zmq.PAIR) bob = self.context.socket(zmq.PAIR) mon = self.context.socket(zmq.SUB) aport = alice.bind_to_random_port('tcp://127.0.0.1') bport = bob.bind_to_random_port('tcp://127.0.0.1') mport = mon.bind_to_random_port('tcp://127.0.0.1') mon.setsockopt(zmq.SUBSCRIBE, mon_sub) self.device.connect_in("tcp://127.0.0.1:%i"%aport) self.device.connect_out("tcp://127.0.0.1:%i"%bport) self.device.connect_mon("tcp://127.0.0.1:%i"%mport) self.device.start() time.sleep(.2) try: # this is currenlty necessary to ensure no dropped monitor messages # see LIBZMQ-248 for more info mon.recv_multipart(zmq.NOBLOCK) except zmq.ZMQError: pass self.sockets.extend([alice, bob, mon]) return alice, bob, mon
Example #4
Source Project: vnpy_crypto Author: birforce File: test_log.py License: MIT License | 6 votes |
def test_init_iface(self): logger = self.logger ctx = self.context handler = handlers.PUBHandler(self.iface) self.assertFalse(handler.ctx is ctx) self.sockets.append(handler.socket) # handler.ctx.term() handler = handlers.PUBHandler(self.iface, self.context) self.sockets.append(handler.socket) self.assertTrue(handler.ctx is ctx) handler.setLevel(logging.DEBUG) handler.root_topic = self.topic logger.addHandler(handler) sub = ctx.socket(zmq.SUB) self.sockets.append(sub) sub.setsockopt(zmq.SUBSCRIBE, b(self.topic)) sub.connect(self.iface) import time; time.sleep(0.25) msg1 = 'message' logger.info(msg1) (topic, msg2) = sub.recv_multipart() self.assertEqual(topic, b'zmq.INFO') self.assertEqual(msg2, b(msg1)+b'\n') logger.removeHandler(handler)
Example #5
Source Project: vnpy_crypto Author: birforce File: test_log.py License: MIT License | 6 votes |
def test_init_socket(self): pub,sub = self.create_bound_pair(zmq.PUB, zmq.SUB) logger = self.logger handler = handlers.PUBHandler(pub) handler.setLevel(logging.DEBUG) handler.root_topic = self.topic logger.addHandler(handler) self.assertTrue(handler.socket is pub) self.assertTrue(handler.ctx is pub.context) self.assertTrue(handler.ctx is self.context) sub.setsockopt(zmq.SUBSCRIBE, b(self.topic)) import time; time.sleep(0.1) msg1 = 'message' logger.info(msg1) (topic, msg2) = sub.recv_multipart() self.assertEqual(topic, b'zmq.INFO') self.assertEqual(msg2, b(msg1)+b'\n') logger.removeHandler(handler)
Example #6
Source Project: vnpy_crypto Author: birforce File: test_log.py License: MIT License | 6 votes |
def test_root_topic(self): logger, handler, sub = self.connect_handler() handler.socket.bind(self.iface) sub2 = sub.context.socket(zmq.SUB) self.sockets.append(sub2) sub2.connect(self.iface) sub2.setsockopt(zmq.SUBSCRIBE, b'') handler.root_topic = b'twoonly' msg1 = 'ignored' logger.info(msg1) self.assertRaisesErrno(zmq.EAGAIN, sub.recv, zmq.NOBLOCK) topic,msg2 = sub2.recv_multipart() self.assertEqual(topic, b'twoonly.INFO') self.assertEqual(msg2, b(msg1)+b'\n') logger.removeHandler(handler)
Example #7
Source Project: cFS-GroundSystem Author: nasa File: TlmMQRecv.py License: Apache License 2.0 | 6 votes |
def main(): """ main method """ # Prepare our context and publisher context = zmq.Context() subscriber = context.socket(zmq.SUB) subscriber.connect("ipc:///tmp/GroundSystem") subscriber.setsockopt(zmq.SUBSCRIBE, b"GroundSystem") while True: try: # Read envelope with address address, contents = subscriber.recv_multipart() print(f"[{address}] {contents}") except KeyboardInterrupt: break # We never get here but clean up anyhow subscriber.close() context.term()
Example #8
Source Project: networkzero Author: tjguk File: sockets.py License: MIT License | 6 votes |
def wait_for_news_from(self, address, topic, wait_for_s, is_raw=False): if isinstance(address, list): addresses = address else: addresses = [address] socket = self.get_socket(addresses, "subscriber") if isinstance(topic, str): topics = [topic] else: topics = topic for t in topics: socket.set(zmq.SUBSCRIBE, t.encode(config.ENCODING)) try: result = self._receive_with_timeout(socket, wait_for_s, use_multipart=True) unserialised_result = _unserialise_for_pubsub(result, is_raw) return unserialised_result except (core.SocketTimedOutError, core.SocketInterruptedError): return None, None
Example #9
Source Project: Computable Author: ktraunmueller File: heartmonitor.py License: MIT License | 6 votes |
def __init__(self, in_addr, out_addr, mon_addr=None, in_type=zmq.SUB, out_type=zmq.DEALER, mon_type=zmq.PUB, heart_id=None): if mon_addr is None: self.device = ThreadDevice(zmq.FORWARDER, in_type, out_type) else: self.device = ThreadMonitoredQueue(in_type, out_type, mon_type, in_prefix=b"", out_prefix=b"") # do not allow the device to share global Context.instance, # which is the default behavior in pyzmq > 2.1.10 self.device.context_factory = zmq.Context self.device.daemon=True self.device.connect_in(in_addr) self.device.connect_out(out_addr) if mon_addr is not None: self.device.connect_mon(mon_addr) if in_type == zmq.SUB: self.device.setsockopt_in(zmq.SUBSCRIBE, b"") if heart_id is None: heart_id = uuid.uuid4().bytes self.device.setsockopt_out(zmq.IDENTITY, heart_id) self.id = heart_id
Example #10
Source Project: pymeasure Author: ralph-group File: listeners.py License: MIT License | 6 votes |
def __init__(self, port, topic='', timeout=0.01): """ Constructs the Listener object with a subscriber port over which to listen for messages :param port: TCP port to listen on :param topic: Topic to listen on :param timeout: Timeout in seconds to recheck stop flag """ super().__init__() self.port = port self.topic = topic self.context = zmq.Context() log.debug("%s has ZMQ Context: %r" % (self.__class__.__name__, self.context)) self.subscriber = self.context.socket(zmq.SUB) self.subscriber.connect('tcp://localhost:%d' % port) self.subscriber.setsockopt(zmq.SUBSCRIBE, topic.encode()) log.info("%s connected to '%s' topic on tcp://localhost:%d" % ( self.__class__.__name__, topic, port)) self.poller = zmq.Poller() self.poller.register(self.subscriber, zmq.POLLIN) self.timeout = timeout
Example #11
Source Project: pymeasure Author: ralph-group File: listeners.py License: MIT License | 6 votes |
def __init__(self, port, topic='', timeout=0.01): """ Constructs the Listener object with a subscriber port over which to listen for messages :param port: TCP port to listen on :param topic: Topic to listen on :param timeout: Timeout in seconds to recheck stop flag """ super().__init__() self.port = port self.topic = topic self.context = zmq.Context() log.debug("%s has ZMQ Context: %r" % (self.__class__.__name__, self.context)) self.subscriber = self.context.socket(zmq.SUB) self.subscriber.connect('tcp://localhost:%d' % port) self.subscriber.setsockopt(zmq.SUBSCRIBE, topic.encode()) log.info("%s connected to '%s' topic on tcp://localhost:%d" % ( self.__class__.__name__, topic, port)) self.poller = zmq.Poller() self.poller.register(self.subscriber, zmq.POLLIN) self.timeout = timeout
Example #12
Source Project: scoop Author: soravux File: scoopzmq.py License: GNU Lesser General Public License v3.0 | 6 votes |
def _addBroker(self, brokerEntry): # Add a broker to the socket and the infosocket. broker_address = "tcp://{hostname}:{port}".format( hostname=brokerEntry.hostname, port=brokerEntry.task_port, ) meta_address = "tcp://{hostname}:{port}".format( hostname=brokerEntry.hostname, port=brokerEntry.info_port, ) self.socket.connect(broker_address) self.infoSocket.connect(meta_address) self.infoSocket.setsockopt(zmq.SUBSCRIBE, b"") self.broker_set.add(brokerEntry)
Example #13
Source Project: python-zeroless Author: zmqless File: zeroless.py License: GNU Lesser General Public License v2.1 | 6 votes |
def sub(self, topics=(b'',)): """ Returns an iterable that can be used to iterate over incoming messages, that were published with one of the topics specified in ``topics``. Note that the iterable returns as many parts as sent by subscribed publishers. :param topics: a list of topics to subscribe to (default=b'') :type topics: list of bytes :rtype: generator """ sock = self.__sock(zmq.SUB) for topic in topics: if not isinstance(topic, bytes): error = 'Topics must be a list of bytes' log.error(error) raise TypeError(error) sock.setsockopt(zmq.SUBSCRIBE, topic) return self.__recv_generator(sock) # PushPull pattern
Example #14
Source Project: pySINDy Author: luckystarufo File: socket.py License: MIT License | 6 votes |
def set_string(self, option, optval, encoding='utf-8'): """Set socket options with a unicode object. This is simply a wrapper for setsockopt to protect from encoding ambiguity. See the 0MQ documentation for details on specific options. Parameters ---------- option : int The name of the option to set. Can be any of: SUBSCRIBE, UNSUBSCRIBE, IDENTITY optval : unicode string (unicode on py2, str on py3) The value of the option to set. encoding : str The encoding to be used, default is utf8 """ if not isinstance(optval, unicode): raise TypeError("unicode strings only") return self.set(option, optval.encode(encoding))
Example #15
Source Project: pySINDy Author: luckystarufo File: test_socket.py License: MIT License | 6 votes |
def test_unicode_sockopts(self): """test setting/getting sockopts with unicode strings""" topic = "tést" if str is not unicode: topic = topic.decode('utf8') p,s = self.create_bound_pair(zmq.PUB, zmq.SUB) self.assertEqual(s.send_unicode, s.send_unicode) self.assertEqual(p.recv_unicode, p.recv_unicode) self.assertRaises(TypeError, s.setsockopt, zmq.SUBSCRIBE, topic) self.assertRaises(TypeError, s.setsockopt, zmq.IDENTITY, topic) s.setsockopt_unicode(zmq.IDENTITY, topic, 'utf16') self.assertRaises(TypeError, s.setsockopt, zmq.AFFINITY, topic) s.setsockopt_unicode(zmq.SUBSCRIBE, topic) self.assertRaises(TypeError, s.getsockopt_unicode, zmq.AFFINITY) self.assertRaisesErrno(zmq.EINVAL, s.getsockopt_unicode, zmq.SUBSCRIBE) identb = s.getsockopt(zmq.IDENTITY) identu = identb.decode('utf16') identu2 = s.getsockopt_unicode(zmq.IDENTITY, 'utf16') self.assertEqual(identu, identu2) time.sleep(0.1) # wait for connection/subscription p.send_unicode(topic,zmq.SNDMORE) p.send_unicode(topic*2, encoding='latin-1') self.assertEqual(topic, s.recv_unicode()) self.assertEqual(topic*2, s.recv_unicode(encoding='latin-1'))
Example #16
Source Project: pySINDy Author: luckystarufo File: test_monqueue.py License: MIT License | 6 votes |
def build_device(self, mon_sub=b"", in_prefix=b'in', out_prefix=b'out'): self.device = devices.ThreadMonitoredQueue(zmq.PAIR, zmq.PAIR, zmq.PUB, in_prefix, out_prefix) alice = self.context.socket(zmq.PAIR) bob = self.context.socket(zmq.PAIR) mon = self.context.socket(zmq.SUB) aport = alice.bind_to_random_port('tcp://127.0.0.1') bport = bob.bind_to_random_port('tcp://127.0.0.1') mport = mon.bind_to_random_port('tcp://127.0.0.1') mon.setsockopt(zmq.SUBSCRIBE, mon_sub) self.device.connect_in("tcp://127.0.0.1:%i"%aport) self.device.connect_out("tcp://127.0.0.1:%i"%bport) self.device.connect_mon("tcp://127.0.0.1:%i"%mport) self.device.start() time.sleep(.2) try: # this is currenlty necessary to ensure no dropped monitor messages # see LIBZMQ-248 for more info mon.recv_multipart(zmq.NOBLOCK) except zmq.ZMQError: pass self.sockets.extend([alice, bob, mon]) return alice, bob, mon
Example #17
Source Project: pySINDy Author: luckystarufo File: test_log.py License: MIT License | 6 votes |
def test_init_socket(self): pub,sub = self.create_bound_pair(zmq.PUB, zmq.SUB) logger = self.logger handler = handlers.PUBHandler(pub) handler.setLevel(logging.DEBUG) handler.root_topic = self.topic logger.addHandler(handler) self.assertTrue(handler.socket is pub) self.assertTrue(handler.ctx is pub.context) self.assertTrue(handler.ctx is self.context) sub.setsockopt(zmq.SUBSCRIBE, b(self.topic)) import time; time.sleep(0.1) msg1 = 'message' logger.info(msg1) (topic, msg2) = sub.recv_multipart() self.assertEqual(topic, b'zmq.INFO') self.assertEqual(msg2, b(msg1)+b'\n') logger.removeHandler(handler)
Example #18
Source Project: pySINDy Author: luckystarufo File: test_log.py License: MIT License | 6 votes |
def test_root_topic(self): logger, handler, sub = self.connect_handler() handler.socket.bind(self.iface) sub2 = sub.context.socket(zmq.SUB) self.sockets.append(sub2) sub2.connect(self.iface) sub2.setsockopt(zmq.SUBSCRIBE, b'') handler.root_topic = b'twoonly' msg1 = 'ignored' logger.info(msg1) self.assertRaisesErrno(zmq.EAGAIN, sub.recv, zmq.NOBLOCK) topic,msg2 = sub2.recv_multipart() self.assertEqual(topic, b'twoonly.INFO') self.assertEqual(msg2, b(msg1)+b'\n') logger.removeHandler(handler)
Example #19
Source Project: python_banyan Author: MrYsLab File: banyan_base_multi.py License: GNU Affero General Public License v3.0 | 6 votes |
def set_subscriber_topic(self, topic, subscriber_socket): """ This method sets a subscriber topic. You can subscribe to multiple topics by calling this method for each topic. :param topic: A topic string :param subscriber_socket: subscriber socket :return: """ # make sure topic is a string if not type(topic) is str: raise TypeError('Subscriber topic must be python_banyan string') # does the subscriber socket exist? if subscriber_socket: subscriber_socket.setsockopt(zmq.SUBSCRIBE, topic.encode()) else: raise ValueError('set_subscriber_topic: socket is None')
Example #20
Source Project: derplearning Author: notkarol File: util.py License: MIT License | 5 votes |
def subscriber(paths): context = zmq.Context() sock = context.socket(zmq.SUB) # sock.connect("tcp://localhost:%s" % port) for path in paths: sock.connect("ipc://" + path) sock.setsockopt(zmq.SUBSCRIBE, b"") return context, sock
Example #21
Source Project: westpa Author: westpa File: test_work_manager.py License: MIT License | 5 votes |
def expect_announcement(self, message): subsocket = self.test_context.socket(zmq.SUB) subsocket.setsockopt(zmq.SUBSCRIBE,b'') subsocket.connect(self.ann_endpoint) time.sleep(SETUP_WAIT) yield time.sleep(SETUP_WAIT) msgs = self.test_core.recv_all(subsocket) try: assert message in [msg.message for msg in msgs] finally: subsocket.close(linger=0)
Example #22
Source Project: westpa Author: westpa File: test_work_manager.py License: MIT License | 5 votes |
def discard_announcements(self): subsocket = self.test_context.socket(zmq.SUB) subsocket.setsockopt(zmq.SUBSCRIBE,b'') subsocket.connect(self.ann_endpoint) time.sleep(SETUP_WAIT) self.test_core.recv_all(subsocket) subsocket.close(linger=0) # Work manager shuts down on inproc signal
Example #23
Source Project: heralding Author: johnnykv File: base_logger.py License: GNU General Public License v3.0 | 5 votes |
def start(self): context = heralding.misc.zmq_context internal_reporting_socket = context.socket(zmq.SUB) internal_reporting_socket.connect(SocketNames.INTERNAL_REPORTING.value) internal_reporting_socket.setsockopt(zmq.SUBSCRIBE, b'') poller = zmq.Poller() poller.register(internal_reporting_socket, zmq.POLLIN) while self.enabled: socks = dict(poller.poll(500)) self._execute_regulary() if internal_reporting_socket in socks and socks[ internal_reporting_socket] == zmq.POLLIN: data = internal_reporting_socket.recv_pyobj() # if None is received, this means that ReportingRelay is going down if not data: self.stop() elif data['message_type'] == 'auth': self.handle_auth_log(data['content']) elif data['message_type'] == 'session_info': self.handle_session_log(data['content']) elif data['message_type'] == 'listen_ports': self.handle_listen_ports(data['content']) elif data['message_type'] == 'aux_info': self.handle_auxiliary_log(data['content']) internal_reporting_socket.close() # at this point we know no more data will arrive. self.loggerStopped()
Example #24
Source Project: CHATIMUSMAXIMUS Author: benhoff File: messaging.py License: GNU General Public License v3.0 | 5 votes |
def __init__(self, parent=None): super().__init__(parent) context = zmq.Context() self.sub_socket = context.socket(zmq.SUB) self.sub_socket.setsockopt(zmq.SUBSCRIBE, b'') self.pub_socket = context.socket(zmq.PUB) self.thread = Thread(target=self._recv_sub_socket, daemon=True) self.thread.start() # service, user, msg, time self._last_message = ('', '', '', time.time())
Example #25
Source Project: Bert-TextClassification Author: a414351664 File: client.py License: MIT License | 5 votes |
def __init__(self, ip='localhost', port=5555, port_out=5556, output_fmt='ndarray', show_server_config=False, identity=None): self.context = zmq.Context() self.sender = self.context.socket(zmq.PUSH) self.identity = identity or str(uuid.uuid4()).encode('ascii') self.sender.connect('tcp://%s:%d' % (ip, port)) self.receiver = self.context.socket(zmq.SUB) self.receiver.setsockopt(zmq.SUBSCRIBE, self.identity) self.receiver.connect('tcp://%s:%d' % (ip, port_out)) if output_fmt == 'ndarray': self.formatter = lambda x: x elif output_fmt == 'list': self.formatter = lambda x: x.tolist() else: raise AttributeError('"output_fmt" must be "ndarray" or "list"') if show_server_config: print('server returns the following config:') for k, v in self.get_server_config().items(): print('%30s\t=\t%-30s' % (k, v)) print('you should NOT see this message multiple times! ' 'if you see it appears repeatedly, ' 'consider moving "BertClient()" out of the loop.')
Example #26
Source Project: vnpy_crypto Author: birforce File: socket.py License: MIT License | 5 votes |
def __setattr__(self, key, value): """Override to allow setting zmq.[UN]SUBSCRIBE even though we have a subscribe method""" _key = key.lower() if _key in ('subscribe', 'unsubscribe'): if isinstance(value, unicode): value = value.encode('utf8') if _key == 'subscribe': self.set(zmq.SUBSCRIBE, value) else: self.set(zmq.UNSUBSCRIBE, value) return super(Socket, self).__setattr__(key, value)
Example #27
Source Project: vnpy_crypto Author: birforce File: socket.py License: MIT License | 5 votes |
def subscribe(self, topic): """Subscribe to a topic Only for SUB sockets. .. versionadded:: 15.3 """ if isinstance(topic, unicode): topic = topic.encode('utf8') self.set(zmq.SUBSCRIBE, topic)
Example #28
Source Project: vnpy_crypto Author: birforce File: test_socket.py License: MIT License | 5 votes |
def test_bad_sockopts(self): """Test that appropriate errors are raised on bad socket options""" s = self.context.socket(zmq.PUB) self.sockets.append(s) s.setsockopt(zmq.LINGER, 0) # unrecognized int sockopts pass through to libzmq, and should raise EINVAL self.assertRaisesErrno(zmq.EINVAL, s.setsockopt, 9999, 5) self.assertRaisesErrno(zmq.EINVAL, s.getsockopt, 9999) # but only int sockopts are allowed through this way, otherwise raise a TypeError self.assertRaises(TypeError, s.setsockopt, 9999, b"5") # some sockopts are valid in general, but not on every socket: self.assertRaisesErrno(zmq.EINVAL, s.setsockopt, zmq.SUBSCRIBE, b'hi')
Example #29
Source Project: vnpy_crypto Author: birforce File: test_poll.py License: MIT License | 5 votes |
def test_pubsub(self): s1, s2 = self.create_bound_pair(zmq.PUB, zmq.SUB) s2.setsockopt(zmq.SUBSCRIBE, b'') # Sleep to allow sockets to connect. wait() poller = self.Poller() poller.register(s1, zmq.POLLIN|zmq.POLLOUT) poller.register(s2, zmq.POLLIN) # Now make sure that both are send ready. socks = dict(poller.poll()) self.assertEqual(socks[s1], zmq.POLLOUT) self.assertEqual(s2 in socks, 0) # Make sure that s1 stays in POLLOUT after a send. s1.send(b'msg1') socks = dict(poller.poll()) self.assertEqual(socks[s1], zmq.POLLOUT) # Make sure that s2 is POLLIN after waiting. wait() socks = dict(poller.poll()) self.assertEqual(socks[s2], zmq.POLLIN) # Make sure that s2 goes into 0 after recv. s2.recv() socks = dict(poller.poll()) self.assertEqual(s2 in socks, 0) poller.unregister(s1) poller.unregister(s2)
Example #30
Source Project: vnpy_crypto Author: birforce File: test_pubsub.py License: MIT License | 5 votes |
def test_basic(self): s1, s2 = self.create_bound_pair(zmq.PUB, zmq.SUB) s2.setsockopt(zmq.SUBSCRIBE, b'') time.sleep(0.1) msg1 = b'message' s1.send(msg1) msg2 = s2.recv() # This is blocking! self.assertEqual(msg1, msg2)