Потоки Python - сбой при доступе к postgreSQL - PullRequest
1 голос
/ 19 июля 2009

вот простая программа для работы с потоками, которая отлично работает:

import psycopg2
import threading
import time

class testit(threading.Thread):
    def __init__(self, currency):
        threading.Thread.__init__(self)
        self.currency = currency

    def run(self):
        global SQLConnection
        global cursor
        SQLString = "Select dval from ddata where dname ='%s' and ddate = '2009-07-17'" \
                %self.currency
        z = time.time()
        while (time.time() - z) < 2:
            print SQLString

SQLConnection = psycopg2.connect(database = "db", user = "xxxx", password = "xxxx")
cursor = SQLConnection.cursor()

a = testit('EURCZK')
b = testit('EURPLN')
a.start()
b.start()

Однако, как только я пытаюсь получить доступ к базе данных postgresql в потоке со следующим кодом, я всегда получаю аварийный останов:

import psycopg2
import threading
import time

class testit(threading.Thread):
    def __init__(self, currency):
        threading.Thread.__init__(self)
        self.currency = currency

    def run(self):
        global SQLConnection
        global cursor
        SQLString = "Select dval from ddata where dname ='%s'and ddate = '2009-07-17'" %self.currency
        z = time.time()
        while (time.time() - z) < 2:
            cursor.execute(SQLString)
            print cursor.fetchall()

SQLConnection = psycopg2.connect(database = "db", user = "xxxx", password = "xxxx")
cursor = SQLConnection.cursor()

a = testit('EURCZK')
b = testit('EURPLN')
a.start()
b.start()

Единственное различие между ними заключается в цикле while. Я довольно новичок в программировании потоков. Библиотека postgres (psycopg2) не является "поточно-безопасной"? Все это работает на Windows XP. Что я могу сделать?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 июля 2009
global SQLConnection
global cursor

Кажется, вы обращаетесь к глобальным потокам из нескольких потоков? Вы не должны никогда делать это, если эти глобальные переменные не являются поточно-ориентированными, или вы сами не обеспечите надлежащую блокировку.

Теперь у вас есть 2 потока, которые обращаются к одному и тому же соединению и к одному и тому же курсору. Они наступят друг на друга. Возможно, соединение psycopg2 поточно-ориентировано, но курсоры - нет.

Использовать один курсор (возможно, одно соединение) на поток.

0 голосов
/ 19 июля 2009

бинго это работает. Кто-то оставил ответ, но затем, кажется, удалил его, чтобы дать каждому потоку свое собственное соединение. И да, это решает это. Итак, этот код работает:

import psycopg2
import threading
import time

class testit(threading.Thread):
    def __init__(self, currency):
        threading.Thread.__init__(self)
        self.currency = currency 
        self.SQLConnection = psycopg2.connect(database = "db", user = "xxxx", password = "xxxx")
        self.cursor = self.SQLConnection.cursor()

    def run(self):
        SQLString = "Select dval from ddata where dname ='%s' and ddate = '2009-07-17'" \
                %self.currency
        z = time.time()
        while (time.time() - z) < 2:
            self.cursor.execute(SQLString)
            print self.cursor.fetchall()

a = testit('EURCZK')
b = testit('EURPLN')
a.start()
b.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...