如何在我的扭曲服务器的后台使用我定义的刷新函数 运行
How to have my defined refresh function running in the background of my twisted server
我有一个简单的 twisted TCP 服务器 运行ning 非常好,它基本上处理数据库请求并显示正确的东西它只是一个具有一系列功能的回显客户端,正在读取的数据库更新我有这个刷新功能来打开数据库并刷新它但是如果我将它添加到消息功能它会花费太长时间来响应因为刷新功能需要大约 6/7 秒才能完成,我最初的想法是拥有这个在 while 循环中运行,运行ning 每 5/10 分钟不断刷新,但在阅读了全局解释器锁之后,它让我认为这是不可能的,关于如何 运行 这个函数的任何建议在我的代码背景中将不胜感激
我试过把它放在一个线程中,但是当我启动线程时它似乎根本 运行 没有,我把它放在 if name[=23= 下] == '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()
你在这行有一个重要的错误:
thread = Thread(target = refreshit())
虽然您没有包含 refreshit
的定义(也许是考虑重命名的函数),但我认为 refreshit
是执行刷新的函数。
在这种情况下,您在这里所做的是调用 refreshit
并等待它return 一个值。然后,returns 的值用作您在此处创建的 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()
您可能还只想 use Twisted's thread support 而不是直接使用 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()
我有一个简单的 twisted TCP 服务器 运行ning 非常好,它基本上处理数据库请求并显示正确的东西它只是一个具有一系列功能的回显客户端,正在读取的数据库更新我有这个刷新功能来打开数据库并刷新它但是如果我将它添加到消息功能它会花费太长时间来响应因为刷新功能需要大约 6/7 秒才能完成,我最初的想法是拥有这个在 while 循环中运行,运行ning 每 5/10 分钟不断刷新,但在阅读了全局解释器锁之后,它让我认为这是不可能的,关于如何 运行 这个函数的任何建议在我的代码背景中将不胜感激
我试过把它放在一个线程中,但是当我启动线程时它似乎根本 运行 没有,我把它放在 if name[=23= 下] == '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()
你在这行有一个重要的错误:
thread = Thread(target = refreshit())
虽然您没有包含 refreshit
的定义(也许是考虑重命名的函数),但我认为 refreshit
是执行刷新的函数。
在这种情况下,您在这里所做的是调用 refreshit
并等待它return 一个值。然后,returns 的值用作您在此处创建的 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()
您可能还只想 use Twisted's thread support 而不是直接使用 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()