守护程序线程与调用join的无限运行普通线程

时间:2019-03-28 11:42:11

标签: python multithreading python-multithreading

对不起,如果这是一个愚蠢的问题,但是在过去的两个星期中,这一直困扰着我,我不得不最后问。我正在尝试听我从Python的Node JS express发送的redis发布消息。我看到有两种可能

  1. 我可以让一个简单的线程无限运行,然后在主线程内调用join,这意味着主线程仅在线程结束时才结束。但是我有一个无限线程,所以好像是作弊代码
  2. 我可以将Thread设置为Daemon并无限运行,但主线程也需要无限运行才能接收诸如KeyboardInterrupt之类的事件
  3. 有人可以解释一下哪种方法更好吗?和有什么区别
  4. 我希望无限期地运行此Python进程,并与从那里发布带有Redis消息的节点Express一起运行,Python会接收它们以便进行一些计算运算。

通用零件

import redis
import threading
import time

client = redis.Redis()
subscriber = client.pubsub()
subscriber.subscribe("klines")

方法1

class ThreadedSubscriber1(threading.Thread):
"""
This class handles subscription messages from redis inside a separate thread in its run() method
"""
def __init__(self):
super().__init__()

def run(self):
for message in subscriber.listen():
print(message)

def main1():
try:
s = ThreadedSubscriber1()
s.start()
s.join()
except KeyboardInterrupt:
pass

main1()

方法2

class ThreadedSubscriber2(threading.Thread):
"""
This class handles subscription messages from redis inside a separate thread in its run() method
"""

def __init__(self):
super().__init__()

def run(self):
for message in subscriber.listen():
print(message)

def main2():
try:
s = ThreadedSubscriber2()
s.setDaemon(True)
s.start()

while True:
time.sleep(1)
except KeyboardInterrupt:
pass

main2()

0 个答案:

没有答案