我正在使用一个简单的pythonic队列和一个pythonic Thread子类...
class WorkerThread( threading.Thread ):
def __init__( self, *args, **kvargs ):
threading.Thread.__init__( self, *args, **kvargs )
self.input_queue = Queue()
def send( self, item ):
assert type( item ) is list
assert item # i.e. must have at least one element
# check that first item is callable
assert hasattr( item[ 0 ], "__call__" )
self.input_queue.put( item )
def close( self ):
self.input_queue.put( None )
self.input_queue.join()
def run( self ):
while True:
method_call_elements = self.input_queue.get()
if method_call_elements is None: # "poison pill"
break
method_args = method_call_elements[ 1 : ]
method_call_elements[ 0 ]( *method_args )
self.input_queue.task_done()
self.input_queue.task_done()
return
...所以你提交的是一个列表,其中第一项是方法,以及可选的其他元素 这是您可能想要提供给方法的任何参数。 NB不能用Java做这种有趣的事情!
问题是:是否有一个简单的pythonic方法从被调用的方法返回一个值?在Java中,显然你可以使用Callable和Future接口。使用更多这样的Java类,我可以看到代码是如何被改变的......确实我认为有几种可能性。但我只是想知道Python是否有处理“未来”类型情况的条款?
BTW我查看了权威指南http://www.jython.org/jythonbook/en/1.0/Concurrency.html - 但这似乎没有给出任何非Java解决方案
的后: 的
任何有兴趣的人,这是我面向Java的解决方案:
@property
def size( lmm_self ):
class FindNodeMapSizeTask( Callable ):
def call( self ):
genLog.info( "thread %s - inside FindNodeMapSizeTask.call()", Thread.currentThread().id )
return len( lmm_self.id_to_node_map )
size_result = FutureTask( FindNodeMapSizeTask() )
lmm_self.internal_ops_worker_thread.send([ size_result.run ])
genLog.info( "thread %s - waiting for Future.get()...", Thread.currentThread().id )
map_size = size_result.get()
genLog.info( "thread %s - ... got Future.get(): %s", Thread.currentThread().id, map_size)
return map_size
典型输出:
线程20 - 等待Future.get()...
主题21 - 在FindNodeMapSizeTask.call()
中线程20 - ...得到Future.get():1121
树大小:1121
size_result.get()阻止从size(lmm_self)返回,直到len(...)传递其结果,即使在def发送中method_call_elements = self.input_queue.get()之后放置了sleep(1)( )。
工作正常,但当然使用Java FutureTask。对我来说任何pythonic解决方案都会引起我的兴趣...
以后仍然
嗯......咨询我的Beasley Python基本参考资料,我可以看到使用threading.Event ......这些行很简单的方法。