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?
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 –
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
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? –