Jython:pythonic相当于java.util.concurrent.Callable?

时间:2012-06-30 07:04:50

标签: java python jython future callable

我正在使用一个简单的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 ......这些行很简单的方法。

0 个答案:

没有答案