Subprocesos en python: recupera el valor de retorno al usar target =

Posible duplicado:
Valor de retorno de hilo

Quiero obtener la “memoria libre” de un grupo de servidores como este:

def get_mem(servername): res = os.popen('ssh %s "grep MemFree /proc/meminfo | sed \'s/[^0-9]//g\'"' % servername) return res.read().strip() 

ya que esto puede ser enhebrado quiero hacer algo así:

 import threading thread1 = threading.Thread(target=get_mem, args=("server01", )) thread1.start() 

Pero ahora: ¿cómo puedo acceder al (los) valor (es) de retorno de las funciones get_mem? ¿Realmente necesito hacer todo lo posible para crear una class MemThread(threading.Thread) y sobrescribir __init__ y __run__ ?

Podría crear una cola sincronizada, pasarla a la función de subproceso y hacer que se informe nuevamente empujando el resultado en la cola, por ejemplo:

 def get_mem(servername, q): res = os.popen('ssh %s "grep MemFree /proc/meminfo | sed \'s/[^0-9]//g\'"' % servername) q.put(res.read().strip()) # ... import threading, queue q = queue.Queue() threading.Thread(target=get_mem, args=("server01", q)).start() result = q.get() 

Para el registro, esto es lo que finalmente se me ocurrió (se desvió de los ejemplos de multiprocesamiento)

 from multiprocessing import Process, Queue def execute_parallel(hostnames, command, max_processes=None): """ run the command parallely on the specified hosts, returns output of the commands as dict >>> execute_parallel(['host01', 'host02'], 'hostname') {'host01': 'host01', 'host02': 'host02'} """ NUMBER_OF_PROCESSES = max_processes if max_processes else len(hostnames) def worker(jobs, results): for hostname, command in iter(jobs.get, 'STOP'): results.put((hostname, execute_host_return_output(hostname, command))) job_queue = Queue() result_queue = Queue() for hostname in hostnames: job_queue.put((hostname, command)) for i in range(NUMBER_OF_PROCESSES): Process(target=worker, args=(job_queue, result_queue)).start() result = {} for i in range(len(hostnames)): result.update([result_queue.get()]) # tell the processes to stop for i in range(NUMBER_OF_PROCESSES): job_queue.put('STOP') return result