сделать python ждать, пока хранимая процедура завершит выполнение

У меня есть скрипт python, который использует pyobbc для вызова хранимой процедуры MSSQL, например:

cursor.execute("exec MyProcedure @param1 = '" + myparam + "'") 

Я вызываю эту хранимую процедуру внутри цикла, и иногда замечаю, что процедура снова вызывается, прежде чем она будет завершена в последний раз. Я знаю это, потому что, если я добавлю строку

 time.sleep(1) 

после строки выполнения все работает нормально.

Есть ли более элегантный и менее дорогостоящий способ сказать: «Спи, пока исполнитель не закончит»?

Обновление (решение Divij): этот код в настоящее время не работает для меня:

 from tornado import gen import pyodbc @gen.engine def func(*args, **kwargs): # connect to db cnxn_str = """ Driver={SQL Server Native Client 11.0}; Server=172.16.111.235\SQLEXPRESS; Database=CellTestData2; UID=sa; PWD=Welcome!; """ cnxn = pyodbc.connect(cnxn_str) cnxn.autocommit = True cursor = cnxn.cursor() for _ in range(5): yield gen.Task(cursor.execute, 'exec longtest') return func() 

2 Solutions collect form web for “сделать python ждать, пока хранимая процедура завершит выполнение”

Там нет встроенного python, который позволяет ждать завершения асинхронного вызова. Однако вы можете добиться этого, используя IOLoop от Tornado. gen интерфейс Tornado позволяет вам зарегистрировать вызов функции как Task и вернуться к следующей строке в вашей функции после завершения вызова. Вот пример использования gen и gen.Task

 from tornado import gen @gen.engine def func(*args, **kwargs) for _ in range(5): yield gen.Task(async_function_call, arg1, arg2) return 

В этом примере выполнение func возобновляется после async_function_call . Таким образом, последующие вызовы asnyc_function_call не будут перекрываться, и вам не придется приостанавливать выполнение основного процесса с time.sleep вызова time.sleep .

Вот мой способ:

В базе данных я делаю таблицу под названием RunningStatus только с одним полем, status , которое bit , и только одна строка, изначально установленная в 0.

В начале моей хранимой процедуры я выполняю строку

 update RunningStatus set status = 1; 

И в конце хранимой процедуры,

 update RunningStatus set status = 0; 

В моем скрипте Python я открываю новое соединение и курсор в одну базу данных. После моей строки execute я просто добавляю

 while 1: q = status_check_cursor.execute('select status from RunningStatus').fetchone() if q[0] == 0: break 

Вам нужно создать новое соединение и курсор, потому что любые вызовы старого соединения прерывают хранимую процедуру и потенциально могут привести к тому, что status никогда не вернется к 0.

Это немного странно, но он отлично работает для меня!

  • MSSQL в python 2.7
  • Курсор podon pyodbc против курсора базы данных
  • Приложение Django зависает при попытке подключиться к базе данных через Apache
  • python и pymssql
  • Таблица сопоставления SQLAlchemy с столбцами non-ascii для класса
  • Настройка Django с базой данных MS SQL Server
  • подключиться к базе данных Azure SQL через pyodbc
  • Ошибка установки Pyodbc на Ubuntu 16.04 с установленным сервером Sql
  •  
    Interesting Posts for Van-Lav

    Как найти минимальное значение в матрице numpy?

    Удалить последние N элементов списка

    Pylons – url.current () неверно, для '/ test' отображается '/ test / test'?

    python 3: как проверить, является ли объект функцией?

    Почему я не должен использовать PyPy над CPython, если PyPy в 6,3 раза быстрее?

    python pandas read_csv разделитель в данных столбца

    Проверить список слов в другой строке

    Есть встроенная функция идентификации в python?

    Почему я не могу получить доступ к переменной из другого класса Python

    Как определить все мои IP-адреса, когда у меня несколько сетевых адаптеров?

    Как сохранить «полную веб-страницу» не только базовый html с помощью Python

    Эффективно генерировать 16-значную буквенно-цифровую строку

    В Git, как мне настроить крюк для запуска серверных команд после принятия фиксации?

    Переменная чередуется независимо от того, существует ли она в отладчике Python

    Список номеров без повторов и заказа

    Python - лучший язык программирования в мире.