сделать 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.

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

  • Получение сообщений SQL Server с использованием ADO и win32com
  • SQLAlchemy - не применяет ограничение внешнего ключа для отношений
  • Каков самый простой способ доступа к mssql с помощью python или ironpython?
  • Pypyodbc: Не удается открыть ошибку lib 'FreeTDS': file not found ") при попытке подключения к SQL-серверу
  • подключиться к базе данных Azure SQL через pyodbc
  • Можно ли использовать несколько курсоров для одного соединения с pyodbc и MS SQL Server?
  • Обновление не выполняется после повторения тупикового запроса в pymssql
  • Установка параметров подключения с помощью Pyodbc + UnixODBC + FreeTDS
  • Подключение к SQL Server 2012 с использованием sqlalchemy и pyodbc
  • Python с MS SQL - усеченный вывод
  • Многопроцессорность Python и доступ к базе данных с помощью pyodbc «небезопасны»?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.