Kami memiliki sepotong python yang bagus yang mengirim beberapa email dan berinteraksi dengan sistem cloud. Bekerja dengan baik. Tapi kita harus memecatnya setiap beberapa menit untuk polling db. Kami benar-benar perlu, untuk tujuan bisnis, agar skrip python menyala secara real time, sehingga tidak ada penundaan pemungutan suara. (Ini melayani orang penjualan yang bertelepon dengan pelanggan.)
Kami benar-benar tidak ingin putaran polling 1 menit. Atau 30 detik. Kami ingin catatan untuk ditampilkan di db dan untuk hal-hal yang terjadi segera.
Cara cepat untuk membuat lalat ini adalah dengan membuatnya menyala ketika tipe catatan tertentu dimasukkan ke dalam tabel.
Bisakah kita menjalankan skrip python dari pemicu?
Per catatan Harun di bawah ini, kita tahu bahwa ini adalah Very Bad Thing ™ , tetapi tabel ini hanya sedikit digunakan (sisipan 0-12 per hari). Polling tabel gagal memenuhi kebutuhan bisnis kami (kami membutuhkan .py untuk segera berjalan - ini jauh lebih baik daripada mengirim email).
Kami percaya cara untuk memenuhi kebutuhan bisnis kami adalah dengan mengatur .net versi python pada SQL Server, dan kemudian meminta T-SQL memanggil skrip python seperti panggilan C # stuff ... tetapi kami tidak tahu bagaimana caranya sebenarnya lakukan ini! (ergo pertanyaan ini).
Dokumen / detail?
Saya mengajukan pertanyaan tindak lanjut tentang Stack Overflow: Bagaimana cara membuat prosedur Python CLR di SQL Server?
Pertanyaan di bawah pertanyaan : Anda memiliki sepotong python. Anda ingin memecat dari pemicu SQL, tetapi Anda tahu itu adalah hal yang sangat buruk. Jadi apa yang Anda lakukan untuk benar-benar mencapai efek yang sama tanpa memiliki kode python di tengah operasi SQL?
Apa pendekatan non-trigger, non-polling untuk menyelesaikan kebutuhan ini?
(Efek yang sama = "masukkan / perbarui / hapus terjadi dalam sebuah tabel dan skrip python dipicu dalam waktu 2 detik dari peristiwa db, tanpa polling tabel")
sumber
Jawaban:
Jangan membuat transaksi pengguna Anda menunggu (semoga!) Berhasil menyelesaikan skrip Python. Seluruh transaksi Anda duduk di sana dan menunggu proses eksternal ini berjalan, mencoba mengirim surat, dll. Saya ragu email benar-benar harus keluar seketika itu - terutama mengingat Anda tidak dapat mengontrol keterlambatan yang dimilikinya saat dialihkan to inbox penerima. Mengapa tidak hanya menjalankan proses lebih sering, jika pengaturan waktu begitu penting?
Tolong beri tip ini untuk melihat-lihat .
Jika Anda benar-benar ingin melakukan ini dengan cara yang salah, Anda bisa mengaktifkan
xp_cmdshell
dan melepaskannya.Sekarang, dengan asumsi pengguna memiliki akses ke
xp_cmdshell
dan / atau akun layanan SQL Server dapat melihat folder tempat skrip python disimpan, Anda harus dapat melakukan ini dari dalam pemicu Anda:Sebagai samping, Anda harus menyatakan dalam pertanyaan Anda bahwa Anda menyadari bahwa ini adalah hal yang sangat buruk TM , tetapi Anda tidak peduli dengan itu, untuk alasan apapun. Saya masih tidak berpikir Anda akan mendapatkan waktu yang tepat seperti yang Anda harapkan, bahkan jika Anda memecat ini dari pelatuk. Sudahkah Anda mempertimbangkan basis data bukannya python?
sumber
Pertama, jika Anda menggunakan pemicu untuk menulis pesan ke tabel yang didedikasikan untuk tujuan ini, Anda bisa terus menjalankan proses penyatuan dengan menunggu 1sec, atau bahkan kurang. Kuncinya adalah membuat kueri pemungutan suara cukup murah (<1ms), dan tidak mengganggu transaksi lainnya (dengan demikian "tabel antrian" khusus).
EG minta proses polling Anda berjalan seperti ini:
Untuk menunggu hingga 25 detik agar satu baris muncul di tabel, polling setiap detik. Pada batas waktu itu hanya mengembalikan resultset kosong.
Yang paling sederhana adalah menggunakan Service Broker, bersama dengan Prosedur Aktivasi Internal yang memanggil Python melalui xp_cmdshell, atau proses eksternal yang loop pada pemblokiran RECEIVE pada antrian broker layanan target. Ini adalah cara kerja Database Mail di bawah tenda.
sumber
Untuk meminimalkan dampak menjalankan skrip Python secara sinkron dari pemicu Anda, Anda dapat membungkus kode Python Anda menjadi
BaseHTTPServer
:Anda kemudian dapat mengirim permintaan HTTP dari pemicu Anda ke daemon di atas, seperti yang diperlihatkan misalnya dalam SO T&J ini . Penangan permintaan bahkan dapat menelurkan utas terpisah untuk menjalankan logika Python Anda secara tidak sinkron.
sumber