Thread verhalten sich anders wie 2 parallele skripte

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

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
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
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.
Antworten