Python функция не начинает выполняться при вызове в потоке - PullRequest
1 голос
/ 06 августа 2020

Я делаю простую Python функцию, в которой у меня есть функция, работающая в основном потоке, с именем Updater, которая теперь только что-то печатает, но будет выполнять другие задачи, и она вызывается schedule, и еще одна функция, которую я хочу запустить параллельно, поэтому для этого я использую потоки.

Вот моя попытка:

import websocket, json, time, schedule, logging, cfscrape, threading, requests

def Run():
    def process_message(ws,msg):
        print(msg)

    def Connect():
        websocket.enableTrace(False)
        ws = websocket.WebSocketApp("wss://stream.binance.com/stream?streams=btcusdt@depth", on_message = process_message)
        ws.run_forever()

def Updater():
    print('Updating..')

threading.Thread(target=Run).start()
schedule.every(1).seconds.do(Updater)

while True:
    schedule.run_pending()
    time.sleep(1)

Я пытаюсь получить это сценарий, выполняющий соединение с веб-сокетом и запланированную функцию одновременно, параллельно с использованием потоков. Проблема с моим кодом в том, что Run не запускается. Только Updater начнет выполняться.

Может ли кто-нибудь мне помочь? Я неправильно использую потоки? Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Вы устанавливаете Run() функцию в качестве цели для потока. Однако, когда вы запускаете функцию, все, что она делает, определяет функции process_message и Connect, но не вызывает их и не возвращает. Итак, на самом деле ваш поток заканчивается сразу после того, как вы его запустили, ничего не делая, поэтому он ничего не печатает.

Самое простое, что вы можете сделать, чтобы заставить его что-то сделать, это:

import websocket, json, time, schedule, logging, cfscrape, threading, requests

def Run():
    def process_message(ws,msg):
        print(msg)

    def Connect():
        websocket.enableTrace(False)
        ws = websocket.WebSocketApp("wss://stream.binance.com/stream?streams=btcusdt@depth", on_message = process_message)
        ws.run_forever()
    
    # no need to call process_message since it will be called automatically by
    # the WebSocketApp created by Connect
    Connect() # Actually call the Connect function, so that it is used in your thread

def Updater():
    print('Updating..')

threading.Thread(target=Run).start()
schedule.every(1).seconds.do(Updater)

while True:
    schedule.run_pending()
    time.sleep(1)

Я бы также посоветовал не называть функции с заглавной буквой в качестве первого символа, поскольку по соглашению ( см. Pep-8 о соглашении об именах ) это должно быть зарезервировано для классов.

1 голос
/ 06 августа 2020

Может случиться так, что он действительно выполняется, но не печатает из-за буферизации, попробуйте выполнить:

print(msg, flush=True)

Кроме того, вы никогда не вызываете функцию подключения. вызвать его в объявлении с отступом in Run

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...