我将一个简单的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 是否有任何处理“未来”类型情况的规定?
顺便说一句,我查看了权威指南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 send() 中的 method_call_elements = self.input_queue.get() 之后放置了 sleep(1)。
工作正常,但当然使用 Java FutureTask。任何对此的pythonic解决方案都会引起我的兴趣......
后来还是
嗯...咨询我的 Beasley Python Essential Reference,我可以看到使用 threading.Event 沿着这些路线做某事的非常清晰的方法...