title: ZeroMQ: HWM on PUSH does not work
body: <p>I am trying to write a server/client script with a server that vents the tasks, and multiple workers that execute it.
  The problem is that my ventilator has so many tasks that it would fill up the memory in a heartbeat.
  I tried to set the HWM before it binds, but with no success. It just keeps on sending messages as soon as a worker connects, completely disregarding the HWM that was set. I also have a sink that keeps record of the tasks that were done.</p>
  
  <p>server.py</p>
  
  <pre><code>import zmq
  
  def ventilate():
      context = zmq.Context()
  
      # Socket to send messages on
      sender = context.socket(zmq.PUSH)
      sender.setsockopt(zmq.SNDHWM, 30) #Big messages, so I don't want to keep too many in queue
      sender.bind("tcp://*:5557")
  
  
      # Socket with direct access to the sink: used to syncronize start of batch
      sink = context.socket(zmq.PUSH)
      sink.connect("tcp://localhost:5558")
  
      print "Sending tasks to workers…"
  
      # The first message is "0" and signals start of batch
      sink.send('0')
      print "Sent starting signal"
  
      while True:
          sender.send("Message")
  
  
  
  if __name__=="__main__":
      ventilate()
  </code></pre>
  
  <p>worker.py</p>
  
  <pre><code>import zmq
  from multiprocessing import Process
  
  def work():
      context = zmq.Context()
  
      # Socket to receive messages on
      receiver = context.socket(zmq.PULL)
      receiver.connect("tcp://localhost:5557")
  
      # Socket to send messages to
      sender = context.socket(zmq.PUSH)
      sender.connect("tcp://localhost:5558")
  
      # Process t asks forever
      while True:
          msg = receiver.recv_msg()
          print "Doing sth with msg %s"%(msg)     
          sender.send("Message %s done"%(msg))
  
  if __name__ == "__main__":
      for worker in range(10):        
          Process(target=work).start()
  </code></pre>
  
  <p>sink.py</p>
  
  <pre><code>import zmq
  
  def sink():
      context = zmq.Context()
  
      # Socket to receive messages on
      receiver = context.socket(zmq.PULL)
      receiver.bind("tcp://*:5558")
  
      # Wait for start of batch
      s = receiver.recv()
      print "Received start signal"
      while True:
          msg = receiver.recv_msg()
          print msg
  
  
  if __name__=="__main__":
      sink()
  </code></pre>