Seite 1 von 1

Thread verhalten sich anders wie 2 parallele skripte

Verfasst: Sonntag 4. Oktober 2015, 08:37
von köttbullar
Hallo Python Forum,

habe ein kleines Problem wenn ich das Programm wie unten aufgeführt laufen lasse dann erhalte ich immer eine Fehlermeldug (siehe unten)

Code: Alles auswählen

#!/usr/bin/python
#-*- coding:utf8 -*-
import psycopg2
import threading

def Eingang():
    while 1:  
        conn = psycopg2.connect("dbname='Database' user='user' host='127.0.0.1' password='geheim'")
        cur = conn.cursor()     
        cur.execute("UPDATE Test SET State=%s WHERE ID=%s", (result.bits[j-1], j))        
        conn.commit()

def Ausgang():
    while 1:
        conn = psycopg2.connect("dbname='Database' user='user' host='127.0.0.1' password='geheim'")
        cur = conn.cursor()
        cur.execute("Select State FROM Test where ID = 1")         
        conn.commit() 
        rows = cur.fetchall()
        E1 = rows[0][0]
       

threads = []
t1 = threading.Thread(target=Eingang)
t2 = threading.Thread(target=Ausgang)
t1.start()
t2.start()


dann kommt folgende Fehlermeldung:


Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
File "./test1.py", line 57, in Ausgang
cur.execute("Select State FROM Test where ID = 1")
InternalError: could not open relation with OID 20648
LINE 1: Select State FROM Test where ID = 1

Wenn ich die Methoden Ausgang und Eingang jeweil in einem seperaten skript laufen lasse, dann funktioniert alles.
Deshalb gehe ich davon aus, dass es was mit meinen Thread zu tun hat

kann mir jemand sagen was ich falsch mache?

bei der Fehlermeldung sieht es so aus als würde es die vielen Datenbank zugriffe nicht verschaffen.
komisch ist aber dass es funktioniert wenn ich die 2 Skripte parallel ausführe ohne die Threads

Re: Thread verhalten sich anders wie 2 parallele skripte

Verfasst: Sonntag 4. Oktober 2015, 09:09
von Sirius3
@köttbullar: zuerst einmal solltest Du Deinen wirklichen Code zeigen. Der gezeigte hat weder eine Zeile 57, noch ist er lauffähig. Die Sache mit commit und fetchall wurde Dir im anderen Beitrag schon angekreidet, hinzu kommt noch, dass es "while True" statt "while 1" heißen sollte. Da Du Connections nie schließt, könnte es sein, dass das der Datenbank irgendwann zuviele werden. Eine Connection pro Thread dürfte bei Dir ausreichend sein.

Re: Thread verhalten sich anders wie 2 parallele skripte

Verfasst: Sonntag 4. Oktober 2015, 09:28
von BlackJack
@köttbullar: Der Traceback passt nicht zum gezeigten Quelltext und *der* ist nicht lauffähig. Also machst Du in dem tatsächlichen Programm vielleicht irgend etwas anders was hier nicht passiert, also wissen wir nicht ob der gezeigte Quelltext überhaupt zu dem Fehler führt.

Zum Thema Threadsicherheit gibt's einen Abschnitt in der Dokumentation: Thread and process safety.