¿Ejecuta simultáneamente dos funciones que toman parámetros y devuelven listas?

Entiendo que dos funciones pueden ejecutarse en paralelo utilizando módulos de multiprocessing o threading , por ejemplo, las funciones Make 2 se ejecutan al mismo tiempo y el multiprocesamiento de Python para procesos paralelos .

Pero los ejemplos anteriores solo usan la función de impresión. ¿Es posible ejecutar funciones que devuelven una lista en paralelo en Python? Si es así, ¿cómo?

He intentado con enhebrado:

 from threading import Thread def func1(x): return [i*i for i in x] def func2(x): return [i*i*i for i in x] nums = [1,2,3,4,5] p1 = Thread(target = func1(nums)).start() p2 = Thread(target = func2(nums)).start() print p1 print p2 

pero tengo el siguiente error:

 Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 808, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 761, in run self.__target(*self.__args, **self.__kwargs) TypeError: 'list' object is not callable None None Exception in thread Thread-2: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 808, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 761, in run self.__target(*self.__args, **self.__kwargs) TypeError: 'list' object is not callable 

He intentado ingresar el parámetro args como una tupla, en lugar de una variable:

 import threading from threading import Thread def func1(x): return [i*i for i in x] def func2(x): return [i*i*i for i in x] nums = [1,2,3,4,5] p1 = Thread(target = func1, args=(nums,)).start() p2 = Thread(target = func2, args=(nums,)).start() print p1, p2 

pero solo devuelve None None , la salida deseada debe ser:

[afuera]:

 [1, 4, 9, 16, 25] [1, 8, 27, 64, 125] 

La función de destino del hilo no puede devolver un valor. O, debo decir, el valor de return se ignora y, como tal, no se comunica nuevamente al hilo de desove. Pero aquí hay un par de cosas que puedes hacer:

1) Comunicarse de nuevo con el hilo de generación utilizando Queue.Queue . Tenga en cuenta la envoltura alrededor de las funciones originales:

 from threading import Thread from Queue import Queue def func1(x): return [i*i for i in x] def func2(x): return [i*i*i for i in x] nums = [1,2,3,4,5] def wrapper(func, arg, queue): queue.put(func(arg)) q1, q2 = Queue(), Queue() Thread(target=wrapper, args=(func1, nums, q1)).start() Thread(target=wrapper, args=(func2, nums, q2)).start() print q1.get(), q2.get() 

2) Use global para acceder a las listas de resultados en sus hilos, así como al proceso de generación:

 from threading import Thread list1=list() list2=list() def func1(x): global list1 list1 = [i*i for i in x] def func2(x): global list2 list2 = [i*i*i for i in x] nums = [1,2,3,4,5] Thread(target = func1, args=(nums,)).start() Thread(target = func2, args=(nums,)).start() print list1, list2 

El objective solo debe recibir el nombre de la función. Los parámetros deben pasarse con el parámetro “args”. No puedo pegar el código porque estoy respondiendo desde mi teléfono móvil … 😉