Voici ce que je suis en train d'accomplir -python -> Module multitraitement
- J'ai environ un million de fichiers que je dois analyser & ajouter le contenu dans un fichier analysable unique.
- Puisqu'un seul processus prend des âges, cette option est désactivée.
- Ne pas utiliser de threads en Python car il s'agit essentiellement d'exécuter un seul processus (à cause de GIL).
- D'où l'utilisation du module multi-traitement. c'est-à-dire engendrant 4 sous-processus pour utiliser toute cette puissance de base brute :)
Jusqu'ici tout va bien, maintenant j'ai besoin d'un objet partagé auquel tous les sous-processus ont accès. J'utilise des files d'attente du module multi-traitement. De plus, tous les sous-processus doivent écrire leur sortie dans un seul fichier. Un endroit potentiel pour utiliser les verrous, je suppose. Avec cette configuration quand je cours, je n'obtiens aucune erreur (ainsi le processus de parent semble bien), il bloque juste. Quand j'appuie sur Ctrl-C, je vois un retraçage (un pour chaque sous-processus). De plus, aucune sortie n'est écrite dans le fichier de sortie. Voici le code (notez que tout fonctionne bien sans multi-processus) -
import os
import glob
from multiprocessing import Process, Queue, Pool
data_file = open('out.txt', 'w+')
def worker(task_queue):
for file in iter(task_queue.get, 'STOP'):
data = mine_imdb_page(os.path.join(DATA_DIR, file))
if data:
data_file.write(repr(data)+'\n')
return
def main():
task_queue = Queue()
for file in glob.glob('*.csv'):
task_queue.put(file)
task_queue.put('STOP') # so that worker processes know when to stop
# this is the block of code that needs correction.
if multi_process:
# One way to spawn 4 processes
# pool = Pool(processes=4) #Start worker processes
# res = pool.apply_async(worker, [task_queue, data_file])
# But I chose to do it like this for now.
for i in range(4):
proc = Process(target=worker, args=[task_queue])
proc.start()
else: # single process mode is working fine!
worker(task_queue)
data_file.close()
return
Qu'est-ce que je fais mal? J'ai également essayé de passer l'open_object ouvert à chacun des processus au moment du frai. Mais pour aucun effet. par exemple, Process(target=worker, args=[task_queue, data_file])
. Mais cela n'a rien changé. Je pense que les sous-processus ne sont pas en mesure d'écrire dans le fichier pour une raison quelconque. Soit l'instance du file_object
ne se reproduit pas (au moment de spawn) ou quelque autre bizarrerie ... Quelqu'un a une idée?
EXTRA: Aussi est-il un moyen de garder une passe & mysql_connection persistante l'ouvrir à travers les sub_processes? Donc, j'ouvre une connexion mysql dans mon processus parent & la connexion ouverte doit être accessible à tous mes sous-processus. Fondamentalement, c'est l'équivalent d'une mémoire partagée en python. Des idées ici?
Si vous n'écrivez pas dans un fichier mais que vous faites une impression, est-ce que cela fonctionne? (sur Linux, je ferais python script.py> out.dat pour empêcher l'inondation de l'écran). – extraneon
Et je pense que proc.start est non bloquant, donc vous devriez probablement attendre quelque part pour donner au processus la possibilité de faire un peu de travail avant de faire le fichier de données. – extraneon
data_file.close() se fait à la toute fin. Cela devrait-il avoir un effet ici? L'impression fonctionne également bien. Je vois la sortie sur l'écran quand j'utilise l'impression ... Mais je veux utiliser le fichier. Aidez-moi! Aussi est-il possible de garder un mysql_connection persistant et de le passer aux sous-processus? –