1

我将一个简单的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 沿着这些路线做某事的非常清晰的方法...

4

0 回答 0