2017-04-27 2 views
0

J'essaie d'appeler une fonction de multitraitement à partir d'un thread python pour éviter que le Global Interpreter Lock n'affecte ma fonction de multitraitement.Python appelant le multitraitement à partir d'un thread séparé

La logique ressemble à ceci:

python --- ongoing python processing... 
     \ 
     -> py thread -> py multiprocessing call -> C-code (dll/ctypes) 

Est-ce que ce sens? Est-ce que le code C fonctionnera sur un noyau séparé, ou est-ce trop complexe pour fonctionner?

Merci.

EDIT: Merci pour la réponse. Je devrais clarifier, mais je dois faire appel à un deuxième thread car je dois d'abord créer un tableau python puis passer le pointeur à une fonction C. Je ne peux donc pas appeler la fonction multiprocessing trop tôt (et le traitement python principal doit commencer et se poursuivre de manière transparente).

EDIT: Voici la logique de code et pourquoi je ne peux pas appeler une 2ème ligne de processus avec le code principal:

main(): 
... 
p = Process(target=save_c, args=(...,)) 
p.start() 
p.join() #Main thread will lock here and wait until return; 

#Other code that needs to be processed follows the multiprocess call 

save_c(): 
''' Function which calls C-module ''' 
_sum = ctypes.CDLL('/home/pi/murphylab_picam/temp/libsum.so') 
_sum.c_function.argtypes = (ctypes.c_int, ctypes.POINTER(ctypes.c_int)) 
_sum.c_function(ctypes.c_int(num_numbers), array_type(*_sum.numbers)) 

Qu'est-ce que je manque ici? Existe-t-il une manière différente d'utiliser le multitraitement en ligne avec un traitement en cours?

Répondre

1

Vous n'avez pas besoin de vous joindre immédiatement après avoir créé un processus tant que vous ne voulez pas attendre que ce processus se termine avant de continuer.

Ceci est le principe de la programmation simultanée.

Une chose importante est que vous appelez finalement join ou votre processus principal se terminera laissant l'enfant orphelin.

child_process = Process(....) 
child_process.start() # the child process will start its independend execution here 

do_some_stuff() 
do_some_more_stuff() 

child_process.join() # here you are waiting for it to finish 
+0

noxdafox, merci pour la réponse. J'ai essayé de clarifier ma question initiale, mais évidemment je ne peux pas commencer un processus dans le fil principal, c'était tout le point de ma question (que je n'ai pas très bien expliqué). Le code Python principal doit démarrer et continuer à fonctionner pendant qu'un pointeur est passé à un module C qui s'exécute sur un noyau différent. Il fonctionne bien avec juste un appel de thread, puis appel C, mais le code Python + C principal, puis exécutez sur un seul thread. Je voudrais que le code C fonctionne sur un deuxième thread. Tx –

+0

Je ne suis pas sûr de comprendre pourquoi vous devez créer ce tableau python dans un thread séparé? Vous pouvez simplement le créer dans le processus principal avant de démarrer l'enfant ou directement au début de l'exécution de l'enfant. – noxdafox

+0

Ok, j'ai réédité ma réponse pour expliquer ma confusion. Comme je l'ai utilisé, main() attend la fin du multitraitement, mais j'ai besoin du traitement pour continuer. Y at-il quelque chose à propos des tuyaux que je ne comprends pas? –