假设我有一个生成线程的类:
import threading
class SomeClass(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
while True:
pass
def doSomething(self):
pass
def doSomethingElse(self):
pass
我想
someClass = SomeClass()
someClass.start()
someClass.doSomething()
someClass.doSomethingElse()
someClass.doSomething()
我该怎么做?我知道我可以在run()
函数内部调用函数,但这不是我的目标。
你不能直接做你想做的事。后台线程正在运行其
run
函数,该函数只是永远循环,因此它不可能执行任何其他操作。当然,您可以在自己的线程上调用类的方法,但这可能不是您想要的。
Qt、.NET或Cocoa等框架可以提供
runOnOtherThread
类型方法的原因是每个线程都运行一个“事件循环”,所以它们真正做的就是发布一个事件。如果将run
方法重写为一个事件循环,您可以自己完成这项工作。例如:现在,您可以这样做:
如果希望稍微简化调用接口,以牺牲类中的更多代码为代价,可以添加如下包装方法:
但是,除非您的} 模块(Python 3
idle
方法有工作要做,否则您实际上只是在这里构建一个等效于单线程线程池的线程池,并且有比从头构建更简单的方法。例如,使用PyPI外的^{concurrent.futures
模块的后台端口):或者,只要stdlib:
池还有其他一些优势,执行者更是如此。例如,如果方法返回值,并且您希望启动两个函数,然后等待结果,然后启动前两个函数的结果的第三个函数,该怎么办?简单:
即使您稍后切换到4个线程池,因此
f1
和f2
可能同时等待并且f2
甚至可能首先返回,您也可以保证在这两个线程完成后立即启动doSomethingElser
。这里还有另一种可能性。您真的需要在该线程中运行代码吗,还是只需要它来修改线程所依赖的变量?如果是后者,只需同步对变量的访问。例如:
站在这条主线上没有什么神奇的。如果除了需要修改
SomeClass
所依赖的变量之外,您还希望将doSomething
从主线程中踢出,这样您就可以做比等待它完成更重要的事情,那么您可以创建一个短期的额外线程来doSomething
:查看concurrent.futures及其
submit
方法,当您将线程池限制为一个工作线程时,该方法可以满足您的需要。相关问题 更多 >
编程相关推荐