Multiprocessing bei getrennten Prozessen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Micki
User
Beiträge: 34
Registriert: Freitag 20. März 2020, 09:17

Die Fragmente, die Du bemängelst, sind Überbleibsel aus der Entstehungsphase die ich (noch) nicht rausgeschmisseb habe, weil sie im nächsten Schritt wieder gebraucht werden. Mir ist klar, dass das für Dich störend wirkt.

Was die Strategie angeht, bin ich ja mittlerweile mit Euch/Dir eins. Mir fehlt eben noch Erfahrung.

Vielen Dank nochmal für Deine Überarbeitung. Das ist ja alles Arbeit.
Könntest Du vielleicht so nett sein und den "spielen"-Part nochmal anschauen. Wenn der läuft, kann ich mich erst mal wieder selbst beschäftigen. Außerdem muss ich Euren "Stil" verstehen lernen.
Am Ende werde ich Euch das Produkt auf alle Fälle zeigen.
Micki
User
Beiträge: 34
Registriert: Freitag 20. März 2020, 09:17

Liebé Pythonianer,
schade, dass niemand meine letzte Bitte bearbeitet.
Jetzt sieht mein Skript zwar schöner aus, kann aber das Gleiche wie am Anfang.
Ein Prozess (tasten) läuft, der 2. Prozess (spielen) läuft nicht.

Wenn ich nachvollziehe, wo der Raspi aussteigt, sehe ich, dass spielen nicht erreicht wird
Das war der Grund, weshalb ich dachte, ich muss nach einer Multiprozesslösung suchen.

Na egal. Es wäre toll, wenn mir jemand helfen könnte.
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

Naja, __blackjacks__ Variante hat einen kleinen Fehler hier:

Code: Alles auswählen

def main():
    tasten()
    threading.Thread(target=spielen, daemon=True).start()
Jeder der den Code versucht zu verstehen, wird relativ schnell sehen, warum `tasten` läuft und warum `spielen` nicht läuft und an diesen zwei Zeilen auch korrigieren können.
Benutzeravatar
__blackjack__
User
Beiträge: 13938
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ups, der ist wirklich peinlich, weil offensichtlich. 😊
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Micki
User
Beiträge: 34
Registriert: Freitag 20. März 2020, 09:17

Tja, ich bin eben ein (noch) Nichtversteher.

Ich hab versucht Gründe zu finden, aber leider erfolglos.
Könnt Ihr bitte so nett sein, und einfach die Lösung posten.
Ich weiß, dass ich mich nicht besonders schlau anstelle, aber es gibt auch Ebenen, auf denen ich was geben kann und tue das auch.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die zwei Zeilen sind vertauscht. Spielen kehrt nicht zurueck, also wird der Thread nie gestartet.
Micki
User
Beiträge: 34
Registriert: Freitag 20. März 2020, 09:17

__deets__ hat geschrieben: Montag 23. März 2020, 15:22 Die zwei Zeilen sind vertauscht. Spielen kehrt nicht zurueck, also wird der Thread nie gestartet.
Danke deets,

jetzt habe ich zum ersten Mal beide Teile gleichzeitig spielen koennen.

Leider bricht "spielen" nach ein paar Toenen ab und berichtet folgendes:

Code: Alles auswählen

ALSA lib seq_hw.c:466:(snd_seq_hw_open) open /dev/snd/seq failed: Cannot allocate memory

MidiInAlsa::initialize: error creating ALSA sequencer client object.

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "/home/pi/rpituto/mforum1.py", line 63, in spielen
    with mido.open_input("Impulse:Impulse MIDI 1 28:0") as inport:
  File "/usr/lib/python3/dist-packages/mido/backends/backend.py", line 91, in open_input
    return self.module.Input(name, **self._add_api(kwargs))
  File "/usr/lib/python3/dist-packages/mido/ports.py", line 161, in __init__
    BasePort.__init__(self, name, **kwargs)
  File "/usr/lib/python3/dist-packages/mido/ports.py", line 86, in __init__
    self._open(**kwargs)
  File "/usr/lib/python3/dist-packages/mido/backends/rtmidi.py", line 119, in _open
    self._rt = rtmidi.MidiIn(name=client_name, rtapi=rtapi)
  File "src/_rtmidi.pyx", line 728, in rtmidi._rtmidi.MidiIn.__cinit__
RuntimeError: MidiInAlsa::initialize: error creating ALSA sequencer client object.
Wenn Du, oder jemand anderes eine Idee hat, waere das toll.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das scheint eher ein allgemeines Problem mit MIDI/ALSA und Feedback-Loops: https://sourceforge.net/p/grfloorboard/ ... /05b28d22/
Benutzeravatar
__blackjack__
User
Beiträge: 13938
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Vielleicht hängt es auch damit zusammen oder wird dadurch begünstigt das für jede Nachricht Input und Output geöffnet und geschlossen werden, statt das *einmal* zu machen, *vor* der Schleife. Das hatte ich ja bereits hinterfragt.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Micki
User
Beiträge: 34
Registriert: Freitag 20. März 2020, 09:17

Ja, das kann sein.
Das folgende Teil-Script laeuft ohne Probleme.

Code: Alles auswählen

import pygame.mixer
pygame.init()
pygame.mixer.init(44100, 16, 2, 4096)
pygame.mixer.music.set_volume(0.6)
sound = pygame.mixer.Sound('/home/pi/rpituto/wav/mitest.wav')
import RPi.GPIO as GPIO
import time
import openpyxl

import mido
from mido import Message
mido.get_input_names()
mido.get_output_names()
mido.backends.rtmidi

from collections import deque
import RPi.GPIO as GPIO

inport = mido.open_input('Impulse:Impulse MIDI 1 28:0')
outport = mido.open_output('E-MU Xmidi 2x2 MIDI 1')

msglog = deque()
echo_delay = 1

while True:

    msg = inport.receive()
    msglog.append({"msg": msg, "due": time.time() + echo_delay})
    outport.send(msglog.popleft()["msg"])
Vielleicht wird die Loop durch den "tasten"-Teil hervorgerufen ...?

Ich habe das obige Teilscript in blackjacks Script eingefuegt. Es zeigt aber die gleichen Ausfaelle, wie das korrigierte blackjack-Script.
Antworten