aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcontrib/zmq/zmq_sub.py32
-rwxr-xr-xcontrib/zmq/zmq_sub3.4.py36
2 files changed, 50 insertions, 18 deletions
diff --git a/contrib/zmq/zmq_sub.py b/contrib/zmq/zmq_sub.py
index 4839f401b1..33a6b4ce65 100755
--- a/contrib/zmq/zmq_sub.py
+++ b/contrib/zmq/zmq_sub.py
@@ -3,12 +3,29 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-# A blocking example using python 2.7 can be obtained from the git history:
-# https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py
+"""
+ ZMQ example using python3's asyncio
+
+ Bitcoin should be started with the command line arguments:
+ bitcoind -testnet -daemon \
+ -zmqpubhashblock=tcp://127.0.0.1:28332 \
+ -zmqpubrawtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashblock=tcp://127.0.0.1:28332
+
+ We use the asyncio library here. `self.handle()` installs itself as a
+ future at the end of the function. Since it never returns with the event
+ loop having an empty stack of futures, this creates an infinite loop. An
+ alternative is to wrap the contents of `handle` inside `while True`.
+
+ A blocking example using python 2.7 can be obtained from the git history:
+ https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py
+"""
-import array
import binascii
-import asyncio, zmq, zmq.asyncio
+import asyncio
+import zmq
+import zmq.asyncio
import signal
import struct
import sys
@@ -55,7 +72,8 @@ class ZMQHandler():
asyncio.ensure_future(self.handle())
def start(self):
- asyncio.ensure_future(self.handle())
+ self.loop.add_signal_handler(signal.SIGINT, self.stop)
+ self.loop.create_task(self.handle())
self.loop.run_forever()
def stop(self):
@@ -63,8 +81,4 @@ class ZMQHandler():
self.zmqContext.destroy()
daemon = ZMQHandler()
-def signal_handler(num, frame):
- daemon.stop()
- exit(0)
-signal.signal(signal.SIGINT, signal_handler)
daemon.start()
diff --git a/contrib/zmq/zmq_sub3.4.py b/contrib/zmq/zmq_sub3.4.py
index bd0c4fb30c..a2ff64b29b 100755
--- a/contrib/zmq/zmq_sub3.4.py
+++ b/contrib/zmq/zmq_sub3.4.py
@@ -3,12 +3,33 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-# A blocking example using python 2.7 can be obtained from the git history:
-# https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py
+"""
+ ZMQ example using python3's asyncio
+
+ Bitcoin should be started with the command line arguments:
+ bitcoind -testnet -daemon \
+ -zmqpubhashblock=tcp://127.0.0.1:28332 \
+ -zmqpubrawtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashblock=tcp://127.0.0.1:28332
+
+ We use the asyncio library here. `self.handle()` installs itself as a
+ future at the end of the function. Since it never returns with the event
+ loop having an empty stack of futures, this creates an infinite loop. An
+ alternative is to wrap the contents of `handle` inside `while True`.
+
+ The `@asyncio.coroutine` decorator and the `yield from` syntax found here
+ was introduced in python 3.4 and has been deprecated in favor of the `async`
+ and `await` keywords respectively.
+
+ A blocking example using python 2.7 can be obtained from the git history:
+ https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py
+"""
-import array
import binascii
-import asyncio, zmq, zmq.asyncio
+import asyncio
+import zmq
+import zmq.asyncio
import signal
import struct
import sys
@@ -56,7 +77,8 @@ class ZMQHandler():
asyncio.ensure_future(self.handle())
def start(self):
- asyncio.ensure_future(self.handle())
+ self.loop.add_signal_handler(signal.SIGINT, self.stop)
+ self.loop.create_task(self.handle())
self.loop.run_forever()
def stop(self):
@@ -64,8 +86,4 @@ class ZMQHandler():
self.zmqContext.destroy()
daemon = ZMQHandler()
-def signal_handler(num, frame):
- daemon.stop()
- exit(0)
-signal.signal(signal.SIGINT, signal_handler)
daemon.start()