我最近开始使用python的线程模块。经过一番尝试和错误之后,我使用大多数教程中提供的以下示例代码成功地实现了基本线程。
class SomeThread(threading.Thread):
def __init__(self, count):
threading.Thread.__init__(self)
def run(self):
print "Do something"
我的问题是:我有一个类,它有一个类变量,还有一个函数,我想在一个单独的线程中运行。但是,该函数使用类变量,也写入类变量。就像这样:
class MyClass:
somevar = 'someval'
def func_to_be_threaded(self):
# Uses other class functions
# Do something with class variables
所以我应该如何“把线程类放在MyClass中”。因此,如果调用MyClass().func_to_threaded(),它将在线程中运行。
可以将类实例传递给线程:
如果我理解正确,您想在单独的线程中运行函数吗?有几种方法可以做到这一点。但基本上你的函数是这样包装的:
它可以通过一个decorator来缩短:
编辑带句柄的更新版本:
这可以如下使用:
现在,如果希望从函数返回一个值,则可以进一步扩展它。考虑一下:
如果您没有concurrent.futures.Future class(例如,因为您使用的是Python2.7或更早版本),那么可以使用这个简化的实现:
我建议阅读concurrent.futures模块,因为它有很多整洁的工具。例如,
Thread
类应该替换为一个ThreadPoolExecutor
实例来限制并发性(例如,您不想发送10k线程的垃圾邮件)。同样使用ThreadPoolExecutor
代码更加简单(而且不易出错):记住,在完成所有并行工作之后,您必须
tp.shutdown()
。我敢肯定你不能把一个函数变成线程。
整个类将被线程化。当您实例化对象时,它的
__init__
将在另一个线程上调用,然后当您在该对象上调用start()
时,它的run()
将在另一个线程上调用一次。所以,如果你有一个任务需要在它自己的线程上(disc IO,socket listening,等等),那么你需要一个类来处理这个任务。
@ndpu的答案解决了您的范围/访问问题。
相关问题 更多 >
编程相关推荐