กำลังอัปเดตหน้าเว็บจากเธรดพื้นหลังโดยใช้ socket.io แต่ไม่มีทริกเกอร์เหตุการณ์

ในเกือบทุกตัวอย่างที่ฉันพบ Flask/Socket.io นั้น Socket.io จะทริกเกอร์เหตุการณ์ที่แอป Flask ประมวลผลแล้ว และจัดการกับการตอบสนองใดๆ ก็ตาม

ฉันต้องพุชข้อมูลใหม่ไปยังเพจอย่างสม่ำเสมอ โดยไม่ต้องมีทริกเกอร์เหตุการณ์ ในบทแนะนำออนไลน์ของ Flask/Socket.io พวกเขาพูดถึงเรื่องนี้สั้นๆ แต่ฉัน ฉันติดขัดมาก

ณ ตอนนี้ ฉันแค่พุชข้อมูลบนการเชื่อมต่อไคลเอนต์เท่านั้น โดยสร้างเธรดใหม่สำหรับทุกการเชื่อมต่อ นี่คือรหัสของฉันสำหรับสิ่งนั้น:

@socketio.on('connect', namespace='/test')
def test_connect():
    # need visibility of the global thread objects
    print "We're working"
    global thread
    print('Client connected')

if not thread.isAlive():
    print "Starting Thread"
    thread = RandomThread()
    thread.start()

แล้ว:

class RandomThread(Thread):
    def __init__(self):
        self.delay = 6
        super(RandomThread, self).__init__()

        ## Find Tweets every X amount of seconds
        def tweetFinder(self):
        print "Finding Tweets..."

        while not thread_stop_event.isSet():
            twit = Twitter()
            twit.login()
            cityName = twit.getUserTweets()
            print cityName
            socketio.emit('newnumber', {'number': cityName}, namespace='/test')
            sleep(self.delay)

    def run(self):
        self.tweetFinder()

แต่ฉันจะทำให้เธรด/กระบวนการพุชข้อมูลเริ่มต้นทันทีเมื่อเปิดตัวแอปพลิเคชันได้อย่างไร ฉันแค่อยากให้มันทำงานอย่างต่อเนื่องและไม่มีที่สิ้นสุดในแบ็กเอนด์ โดยอัปเดตหน้าโดยไม่คำนึงถึงกิจกรรม

นี่คือสิ่งที่เอกสาร Flask/Socket-io พูด ฉันไม่สามารถหาวิธีทำให้มันทำงานอย่างที่ฉันต้องการได้

ในตัวอย่างทั้งหมดที่แสดงจนถึงจุดนี้ เซิร์ฟเวอร์ตอบสนองต่อเหตุการณ์ที่ส่งโดยไคลเอนต์ แต่สำหรับบางแอปพลิเคชัน เซิร์ฟเวอร์จะต้องเป็นผู้ริเริ่มข้อความ สิ่งนี้มีประโยชน์ในการส่งการแจ้งเตือนไปยังไคลเอนต์เกี่ยวกับเหตุการณ์ที่เกิดขึ้นในเซิร์ฟเวอร์ เช่น ในเธรดพื้นหลัง สามารถใช้เมธอด socketio.send() และ socketio.emit() เพื่อออกอากาศไปยังไคลเอนต์ที่เชื่อมต่อทั้งหมด:

def some_function():
    socketio.emit('some event', {'data': 42})

โปรดทราบว่าในการใช้งานนี้ไม่มีบริบทของไคลเอนต์ ดังนั้นจึงถือว่า Broadcast=True และไม่จำเป็นต้องระบุ


person carbon_ghost    schedule 18.12.2014    source แหล่งที่มา
comment
ไม่แน่ใจว่าฉันเข้าใจปัญหา ปัญหาเดียวของคุณที่คุณต้องการเริ่มเธรดพื้นหลังก่อนที่ไคลเอนต์จะเชื่อมต่อคืออะไร? ถ้าใช่ ทำไมคุณไม่เริ่มกระทู้ก่อนที่จะโทร socketio.run()?   -  person Miguel    schedule 19.12.2014
comment
ฉันทำสิ่งที่คล้ายกันมากตามตัวอย่างที่ฉันแนะนำบน GitHub ดูที่นี่: stackoverflow.com/questions/41443676/ ตัวอย่างของฉันกำลังรับข้อมูลจากเธรด ZeroMQ แต่คุณสามารถสร้างข้อมูลในเธรดพื้นหลังนั้นได้อย่างง่ายดายแทน   -  person Jon Cage    schedule 04.01.2017