def _test_loop(verbose=False): def on_cancel_timer_event(loop, timer_id, arg): cancel_timer_id = arg # This loop is the low-level zloop not the # types.Loop class. Need a cleaner way! from pyczmq import zloop zloop.timer_end(loop, cancel_timer_id) return 0 def on_timer_event(loop, item, arg): output_s = ffi.from_handle(arg) output_s.send('PING') return 0 def on_socket_event(loop, item, arg): # typically arg would be some class object containing state # information that would be used within this event handler. input_s = ffi.from_handle(arg) assert input_s.recv() == 'PING' return -1 # end the reactor ctx = Context() output_s = ctx.socket(zmq.PAIR) input_s = ctx.socket(zmq.PAIR) output_s.bind('inproc://zloop.test') input_s.connect('inproc://zloop.test') loop = Loop() loop.set_verbose(verbose) # create a timer that will be cancelled cancel_timer_id = loop.timer(1000, 1, on_timer_event, None) loop.timer(5, 1, on_cancel_timer_event, cancel_timer_id) # After 10 msecs, send a ping message to output loop.timer(20, 1, on_timer_event, output_s.sock) poll_input = zmq.pollitem(socket=input_s.sock, events=zmq.POLLIN) # When we get the ping message, end the reactor loop.poller(poll_input, on_socket_event, input_s.sock) loop.set_tolerant(poll_input) loop.start() del loop del ctx
def test_zloop(verbose=False): ctx = zctx.new() output_s = zsocket.new(ctx, zmq.PAIR) input_s = zsocket.new(ctx, zmq.PAIR) zsocket.bind(output_s, "inproc://lkj") zsocket.connect(input_s, "inproc://lkj") @zloop.poll_callback def on_socket_event(loop, item, arg): assert zstr.recv(item.socket) == "PING" assert arg == 3 return -1 @zloop.timer_callback def on_timer_event(loop, item, arg): zstr.send(arg, "PING") return 0 @zloop.timer_callback def on_cancel_timer_event(loop, item, arg): cancel_timer_id = arg rc = zloop.timer_end(loop, cancel_timer_id) assert rc == 0 return 0 l = zloop.new() zloop.set_verbose(l, verbose) # create a timer that will be cancelled cancel_timer_id = zloop.timer(l, 1000, 1, on_timer_event, None) zloop.timer(l, 5, 1, on_cancel_timer_event, cancel_timer_id) # After 10 msecs, send a ping message to output zloop.timer(l, 20, 1, on_timer_event, output_s) # When we get the ping message, end the reactor poll_input = zmq.pollitem(socket=input_s, events=zmq.POLLIN) zloop.poller(l, poll_input, on_socket_event, 3) zloop.set_tolerant(l, poll_input) zloop.start(l) del l del ctx
def test_zloop(verbose=False): ctx = zctx.new() output_s = zsocket.new(ctx, zmq.PAIR) input_s = zsocket.new(ctx, zmq.PAIR) zsocket.bind(output_s, 'inproc://lkj') zsocket.connect(input_s, 'inproc://lkj') @zloop.poll_callback def on_socket_event(loop, item, arg): assert zstr.recv(item.socket) == 'PING' assert arg == 3 return -1 @zloop.timer_callback def on_timer_event(loop, item, arg): zstr.send(arg, 'PING') return 0 @zloop.timer_callback def on_cancel_timer_event(loop, item, arg): cancel_timer_id = arg rc = zloop.timer_end(loop, cancel_timer_id) assert (rc == 0) return 0 l = zloop.new() zloop.set_verbose(l, verbose) # create a timer that will be cancelled cancel_timer_id = zloop.timer(l, 1000, 1, on_timer_event, None) zloop.timer(l, 5, 1, on_cancel_timer_event, cancel_timer_id) # After 10 msecs, send a ping message to output zloop.timer(l, 20, 1, on_timer_event, output_s) # When we get the ping message, end the reactor poll_input = zmq.pollitem(socket=input_s, events=zmq.POLLIN) zloop.poller(l, poll_input, on_socket_event, 3) zloop.set_tolerant(l, poll_input) zloop.start(l) del l del ctx
def _test_loop(verbose=False): # TODO: this test function is not working properly! # segfault occurs when trying to call timer callback. def on_socket_event(loop, item, arg): # typically arg would be some class object containing state # information that would be used within this event handler. input_s = ffi.from_handle(arg) assert input_s.recv() == 'PING' return -1 # end the reactor def on_timer_event(loop, item, arg): output_s = ffi.from_handle(arg) output_s.send('PING') return 0 ctx = Context() output_s = ctx.socket(zmq.PAIR) input_s = ctx.socket(zmq.PAIR) output_s.bind('inproc://zloop.test') input_s.connect('inproc://zloop.test') loop = Loop() loop.set_verbose(verbose) # After 10 msecs, send a ping message to output loop.timer(10, 1, on_timer_event, output_s.sock) poll_input = zmq.pollitem(socket=input_s.sock, events=zmq.POLLIN) # When we get the ping message, end the reactor loop.poller(poll_input, on_socket_event, input_s.sock) loop.set_tolerant(poll_input) loop.start() del loop del ctx
def test_zloop(): ctx = zctx.new() output = zsocket.new(ctx, zmq.PAIR) input = zsocket.new(ctx, zmq.PAIR) zsocket.bind(output, 'inproc://lkj') zsocket.connect(input, 'inproc://lkj') @ffi.callback('zloop_fn') def item_handler(loop, item, arg): assert zstr.recv(item.socket) == 'PING' assert ffi.from_handle(arg) == 3 return -1 @ffi.callback('zloop_fn') def timer_handler(loop, item, arg): zstr.send(arg, 'PING') return 0 l = zloop.new() zloop.timer(l, 10, 1, timer_handler, output) zloop.poller( l, zmq.pollitem(socket=input, events=zmq.POLLIN), item_handler, 3) zloop.start(l)