Как сделать так, чтобы моя заданная функция обновления работала на фоне моего витого сервера? - PullRequest
0 голосов
/ 18 февраля 2019

У меня простой витой TCP-сервер, работающий абсолютно нормально, он в основном работает с запросами к базе данных и отображает правильные вещи, это просто эхо-клиент с набором функций, база данных, которая читается, также обновляет, у меня есть эта функция обновленияоткройте базу данных и обновите ее, однако, если я добавлю это к функциям сообщений, ответ займет слишком много времени, так как функция обновления занимает около 6/7 секунд, моя первоначальная идея заключалась в том, чтобы эта функция была в цикле while и работалапостоянно обновляется каждые 5/10 минут, но после прочтения информации о глобальной блокировке интерпретатора я подумал, что это невозможно, и любые предложения о том, как запустить эту функцию на фоне моего кода, будут высоко оценены

Я попытался поместить его в поток, но он, кажется, не запускается вообще, когда я запускаю поток, я помещаю его под if name == ' main ':функция и не повезло!

Вот моя функция обновления

def refreshit()
    Application = win32com.client.Dispatch("Excel.Application")
    Workbook = Application.Workbooks.open(database)
    Workbook.RefreshAll()
    Workbook.Save()
    Application.Quit()
    xlsx = pd.ExcelFile(database)
    global datess
    global refss
    df = pd.read_excel(xlsx, sheet_name='Sheet1')
    datess = df.groupby('documentDate')
    refss = df.groupby('reference')


class Echo(Protocol):
    global Picked_DFS
    Picked_DFS = None
    label = None
    global errors
    global picked
    errors = []
    picked = []
    def dataReceived(self, data):
        """
        As soon as any data is received, write it back.
        """
        response = self.handle_message(data)
        print('responding with this')
        print(response)
        self.transport.write(response)

def main():
    f = Factory()
    f.protocol = Echo
    reactor.listenTCP(8000, f)
    reactor.run()

if __name__ == '__main__':
    main()

Я имел трид это безрезультатно

if __name__ == '__main__':
    main()
    thread = Thread(target = refreshit())
    thread.start()
    thread.join()

1 Ответ

0 голосов
/ 18 февраля 2019

В этой строке есть важная ошибка:

thread = Thread(target = refreshit())

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

В этом случае вы здесь вызываете refreshit и ждете, пока он вернет значение.Затем возвращаемое значение используется в качестве цели для Thread, который вы здесь создаете.Это, вероятно, не то, что вы имели в виду.Вместо этого:

thread = Thread(target = refreshit)

То есть, refreshit сам - это то, что вы хотите, чтобы целью потока была.

Вы также должны быть уверены в последовательностиваши операции, чтобы все запускалось одновременно:

if __name__ == '__main__':
    # Start your worker/background thread.
    thread = Thread(target = refreshit)
    thread.start()
    # Run Twisted
    main()
    # Cleanup/wait on your worker/background thread.
    thread.join()

Вы также можете просто захотеть использовать поддержку потоков Twisted вместо непосредственного использования модуля threading (но это не обязательно).

if __name__ == '__main__':
    # Start your worker/background thread.
    thread = Thread(target = refreshit)
    thread.start()
    # Run Twisted
    main()
    # Cleanup/wait on your worker/background thread.
    thread.join()
...