Saya bertanya-tanya apakah ada perpustakaan untuk panggilan metode asinkron dengan Python . Akan lebih bagus jika Anda bisa melakukan sesuatu seperti
@async
def longComputation():
<code>
token = longComputation()
token.registerCallback(callback_function)
# alternative, polling
while not token.finished():
doSomethingElse()
if token.finished():
result = token.result()
Atau untuk memanggil rutin non-async secara asinkron
def longComputation()
<code>
token = asynccall(longComputation())
Alangkah baiknya memiliki strategi yang lebih halus sebagai asli dalam inti bahasa. Apakah ini dipertimbangkan?
python
asynchronous
Stefano Borini
sumber
sumber
async
danawait
sintaksis dari 3.5).Jawaban:
Anda dapat menggunakan modul multiprosesing yang ditambahkan dengan Python 2.6. Anda dapat menggunakan kumpulan proses dan kemudian mendapatkan hasil secara tidak sinkron dengan:
Misalnya:
Ini hanya satu alternatif. Modul ini menyediakan banyak fasilitas untuk mencapai apa yang Anda inginkan. Juga akan sangat mudah untuk membuat dekorator dari ini.
sumber
from multiprocessing.dummy import Pool
. multiprocessing.dummy memiliki perilaku yang sama persis diimplementasikan di atas utas alih-alih prosesSesuatu seperti:
Lihat dokumentasi di https://docs.python.org/library/threading.html untuk lebih jelasnya.
sumber
Pada Python 3.5, Anda dapat menggunakan generator yang disempurnakan untuk fungsi async.
Sintaks generator yang ditingkatkan:
async/await
Sintaks baru :sumber
Itu bukan dalam inti bahasa, tetapi perpustakaan yang sangat matang yang melakukan apa yang Anda inginkan adalah Twisted . Ini memperkenalkan objek Ditangguhkan, yang dapat Anda lampirkan panggilan balik atau penangan kesalahan ("errbacks"). A Deferred pada dasarnya adalah "janji" bahwa suatu fungsi pada akhirnya akan membuahkan hasil.
sumber
Anda dapat menerapkan dekorator untuk membuat fungsi Anda tidak sinkron, meskipun itu agak rumit. The
multiprocessing
Modul penuh kebiasaan kecil dan pembatasan tampaknya sewenang-wenang - semua alasan untuk merangkum belakang antarmuka yang ramah, meskipun.Kode di bawah ini menggambarkan penggunaan dekorator:
Dalam kasus dunia nyata saya akan menjelaskan sedikit lebih banyak pada dekorator, menyediakan beberapa cara untuk mematikannya untuk debugging (sambil menjaga antarmuka masa depan di tempat), atau mungkin fasilitas untuk berurusan dengan pengecualian; tapi saya pikir ini menunjukkan prinsip dengan cukup baik.
sumber
Hanya
sumber
Anda bisa menggunakan eventlet. Ini memungkinkan Anda menulis apa yang tampak sebagai kode sinkron, tetapi membuatnya beroperasi secara tidak sinkron melalui jaringan.
Berikut ini contoh crawler super minimal:
sumber
Solusi saya adalah:
Dan berfungsi persis seperti yang diminta:
sumber
Sesuatu seperti ini berfungsi untuk saya, Anda kemudian dapat memanggil fungsi, dan itu akan mengirim dirinya sendiri ke utas baru.
sumber
Apakah ada alasan untuk tidak menggunakan utas? Anda bisa menggunakan
threading
kelas. Alih-alihfinished()
fungsi gunakanisAlive()
. Theresult()
Fungsi bisajoin()
benang dan mengambil hasilnya. Dan, jika Anda bisa, menimparun()
dan__init__
fungsi untuk memanggil fungsi yang ditentukan dalam konstruktor dan menyimpan nilai di suatu tempat ke instance kelas.sumber
Anda dapat menggunakan concurrent.futures (ditambahkan dengan Python 3.2).
sumber
Anda bisa menggunakan proses. Jika Anda ingin menjalankannya selamanya gunakan saat (seperti jaringan) dalam fungsi Anda:
jika Anda hanya ingin menjalankannya sekali saja, lakukan seperti itu:
sumber