سؤال

كيف يمكن للمرء أن يذهب إلى إلغاء تنفيذ عبارة استعلام باستخدام pyscopg2 (برنامج تشغيل python postgres)؟

كمثال، دعنا نقول أن لدي التعليمات البرمجية التالية:

import psycopg2
cnx_string = "something_appropriate"

conn = psycopg2.connect(cnx_string)
cur = conn.cursor()
cur.execute("long_running_query")

ثم أريد إلغاء تنفيذ هذا الاستعلام المدى الطويل من مؤشر ترابط آخر - ما الطريقة التي يجب علي الاتصال بها على كائنات الاتصال / المؤشر للقيام بذلك؟

هل كانت مفيدة؟

المحلول

يمكنك إلغاء استعلام عن طريق الاتصال pg_cancel_backend(pid) وظيفة postgresql في اتصال منفصل.

يمكنك معرفة PID الخلفية للإلغاء من connection.get_backend_pid() طريقة PSYCOPG2 (متوفرة من الإصدار 2.0.8).

نصائح أخرى

كان دعم تنفيذ ASYNC الخاص ب PSYCOPG2 إزالة.

إذا كنت تستطيع استخدام py-postgresql و المعاملات (إنها PY3K)، التنفيذ الداخلي غير متزامن ويدعم يجري انقطع.

كائن الاتصال لديه عضو إلغاء. باستخدام هذا والخيوط التي يمكنك استخدامها

sqltimeout = threading.Timer(sql_timeout_seconds, conn.cancel)
sqltimeout.start()

عند انتهاء الصلاحية مؤقتا، يتم إرسال الإلغاء إلى الاتصال وسيتم رفع استثناء بواسطة الخادم. لا تنس إلغاء الموقت عند انتهاء الاستعلام عادة ....

sqltimeout.cancel()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top