Funktioniert multiprocessing bzw. os.fork() auf OS X bzw. muss man etwas am OS zuvor einstellen, damit die Anweisungen aus den Libraries funktionieren.
Dieses einfache Bsp. sollte nur die Werte einlesen und in der List erg den eingelesenen Wert und die Process_id speichern.
Es werden aber die Tasks aus der Queue nicht abgearbeitet.
Code: Alles auswählen
import multiprocessing
#
class MultiProcess(multiprocessing.Process):
def __init__(self, task_queue, process_id):
multiprocessing.Process.__init__(self)
self.__task_queue = task_queue
self.__process_id = process_id
print('Created Process: ' + str(self.__process_id))
#
def run(self):
print('Running Process: ' + str(self.__process_id))
while True:
next_task = self.__task_queue.get()
if next_task is None:
print('Cancel Process: ' + str(self.__process_id))
break
print('Working Process: ' + str(self.__process_id))
erg[next_task].append(task[next_task])
erg[next_task].append(self.__process_id)
self.__task_queue.task_done()
return
#
if __name__ == '__main__':
task = [12, 5, 76, 34, 5, 2, 8, 67, 89, 345]
erg = []
for i in range(len(task)):
erg.append([])
#
# manager = multiprocessing.Manager()
# tasks = manager.Queue()
tasks = multiprocessing.Queue() #.Queue(1)
num_processes = multiprocessing.cpu_count() # 1
processes = [MultiProcess(tasks, i) for i in range(num_processes)]
#
for p in processes:
p.daemon = True
p.start()
print('Started Process: ' + str(p))
#
for task_id in range(len(task)):
tasks.put(task_id)
print('Queued Task: ' + str(task_id))
#
for p in processes:
p.join()
#
for i in erg:
print(i)
#
Created Process: 0
Created Process: 1
Created Process: 2
Created Process: 3
Started Process: <MultiProcess(MultiProcess-1, started daemon)>
Started Process: <MultiProcess(MultiProcess-2, started daemon)>
Started Process: <MultiProcess(MultiProcess-3, started daemon)>
Started Process: <MultiProcess(MultiProcess-4, started daemon)>
Queued Task: 0
Queued Task: 1
Queued Task: 2
Queued Task: 3
Queued Task: 4
Queued Task: 5
Queued Task: 6
Queued Task: 7
Queued Task: 8
Queued Task: 9 --> hier bleibt der Job hängen
Wenn: tasks = multiprocessing.Queue() abgeändert wird auf: tasks = multiprocessing.Queue(1),
bleibt der Job schon bei dem Statement: Queued Task: 0 hängen
Änderung mit manager.Queue() bewirkt auch nichts
Wenn diese zwei Zeilen ausdokumentiert werden:
for p in processes:
p.join()
Auch Statements um leere Tasks in die Queue zu stellen wie:
for p in processes:
tasks.put(None)
bringt keinen Erfolg
läuft der Prozess komplett durch, tut aber gar nichts, da das Hauptprogramm nicht auf die Nebenprozesse wartet.
Um mutliprocessing zu umgehen habe ich ein Minibsp. mit os.fork() versucht, welches aber auch nicht läuft
Code: Alles auswählen
import os
#
def child():
print('A new child')
print('Second task')
os._exit(0)
#
def parent():
while True:
newpid = os.fork()
if newpid == 0:
child()
else:
pids = (os.getpid(), newpid)
print("parent: %d, child: %d" % pids)
if input() == 'q':
break
#
if __name__ == '__main__':
parent()
parent: 851, child: 853
parent: 851, child: 854A new child
q
Somit wird in der Funktion child() nur das erste print(...) ausgeführt, die zwei weiteren nicht mehr und auch das os._exit(0) nicht
In der Aktivitätsanzeige muss ich die gestarteten Prozess manuell canceln.
Wenn ich die print-Anweisungen hinaus geben und somit das os._exit(0) als erste und einzige Anweisung stehen lasse, dann terminiert sich der Child-Prozess selbst, tut aber auch nichts, ist somit auch unnötig.
Auch alle anderen Codes bzgl. multiprocessing bzw. os.fork(), welche ich im Internet gefunden habe, laufen auf meinem Mac nicht
Alle _threads, threading, bzw. threading/queue-Programme, welche ich geschrieben habe, funktionieren einwandfrei
Danke vorab an alle Antworter