threading und raw_input()

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

ich habe mehrere Threads am laufen und sobald ich in einem Modul, das nicht als Thread läuft und vom Hauptprogramm gestartet wird, ein raw_input() mache stoppen alle.
Ich weiß nicht warum - bei einem vereinfachtem Programm geht es.
Der Code ist Teil meines Projekts - FBCallNotify: https://developer.berlios.de/projects/fbcallnotify/

Hauptprogramm: fbcallnotify.py
Threads: Klassen: Parse, Callmonitor Module: notifyer

Modul: interface Funktion: start()
Ist die Stelle mit raw_input()

Vielen Dank schonmal fürs Lesen und Viele Grüße
Maxi
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Ich vermute, dass hier der GIL zuschlägt. Du müsstest dann separate Prozesse verwenden statt Threads.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

OK, Danke.

Was mich nur wundert - ich habe ein einfaches Beispiel zusammen geschrieben, was im Grunde das gleiche macht, nur es funktioniert.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import threading

class test(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        
    def run(self):
        while True:
            print "Test"

test = test()
test.start()

raw_input()
Viele Grüße
Maxi
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Vorab: Deine commit-Messages sind nicht zu gebrauchen, da die Versionskontrolle das sowieso macht, was du schreibst.
Das hier solltest du vielleicht lesen: http://who-t.blogspot.com/2009/12/on-co ... sages.html

IMHO ist das nicht das gleiche, da `raw_input` blockt, `print` nicht.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Das Problem dürfte eher die Kombination Threads und pynotify sein, `raw_input()` gibt den GIL schon frei und mit gobject alleine funktioniert das auch.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,
Vorab: Deine commit-Messages sind nicht zu gebrauchen, da die Versionskontrolle das sowieso macht, was du schreibst.
Ich weiß, wenn da gravierende Änderungen wären würde ich andere schreiben, aber ich habe da hauptsächlich den Code hochgeladen um ihn hier zu zeigen und nicht immer auf Pastebin oder sonstwo hingehen zu müssen und haufenweise Texte einzufügen zu müssen. (Also das wird schon ein Projekt - mit richtigen commit-Messages)
IMHO ist das nicht das gleiche, da `raw_input` blockt, `print` nicht.
Stimmt nicht...
Zeile 17: raw_input()
Das Problem dürfte eher die Kombination Threads und pynotify sein
Habe alles was damit zutun hatte auskommentiert.
Jetzt geht es aber so wirklich die Lösung ist es nicht - ich brauche pynotify ja.

Mit multiprocessing habe ich mich mal auseinander gesetzt und dabei folgenden Fehler erhalten:

Code: Alles auswählen

Connected to 127.0.0.1:1030
FBCallNotify - Command Promt
Process Process-3:
Traceback (most recent call last):
  File "/usr/lib/python2.6/multiprocessing/process.py", line 232, in _bootstrap
    self.run()
  File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run
    self._target(*self._args, **self._kwargs)
  File "./fbcallnotify.py", line 38, in start
    action = raw_input("Type \"help\" for help: ")
EOFError: EOF when reading a line
Type "help" for help: 
Viele Grüße
Maxi
Antworten