Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Python

Python - Pemrograman Multithreaded

Halaman SebelumnyaHalaman Berikutnya

Menjalankan beberapa utas mirip dengan menjalankan beberapa program berbeda secara bersamaan, tetapi dengan manfaat berikut

  • Beberapa utas dalam suatu proses berbagi ruang data yang sama dengan utas utama dan oleh karena itu dapat berbagi informasi atau berkomunikasi satu sama lain dengan lebih mudah daripada jika mereka adalah proses yang terpisah.

  • Utas terkadang disebut proses ringan dan tidak memerlukan banyak memori di atas kepala; mereka lebih murah daripada proses.

Sebuah thread memiliki awal, urutan eksekusi, dan kesimpulan. Ia memiliki penunjuk instruksi yang melacak di mana dalam konteksnya ia sedang berjalan.

  • Itu dapat didahului (diinterupsi)

  • Ini dapat ditunda sementara (juga dikenal sebagai tidur) saat utas lainnya sedang berjalan - ini disebut menghasilkan.

Memulai Utas Baru

Untuk menelurkan utas lain, Anda perlu memanggil metode berikut yang tersedia di utas modul

thread.start_new_thread ( function, args[, kwargs] )

Panggilan metode ini memungkinkan cara yang cepat dan efisien untuk membuat utas baru di Linux dan Windows.

Pemanggilan metode segera kembali dan utas anak dimulai dan memanggil fungsi dengan daftar args . yang diteruskan . Saat fungsi kembali, utas berakhir.

Di sini, args adalah tupel argumen; gunakan Tuple kosong untuk memanggil fungsi tanpa memberikan argumen apa pun. kwargs adalah kamus opsional argumen kata kunci.

Contoh

#!/usr/bin/pythonimport threadimport time# Tentukan fungsi untuk threaddef print_time( threadName, delay):count =0 while count <5:time.sleep(delay) count +=1 print "%s:%s" % ( threadName, time.ctime(time.time()) )# Buat dua thread sebagai berikutcoba:thread.start_new_thread( print_time, ("Thread-1", 2, ) ) thread. start_new_thread( print_time, ("Thread-2", 4, ) )kecuali:print "Error:tidak dapat memulai thread" while 1:lulus

Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut

Thread-1:Kam 22 Jan 15:42:17 2009Thread-1:Kam 22 Jan 15:42:19 2009Thread-2:Kam 22 Jan 15:42:19 2009Thread-1:Kam 22 Jan 15:42:21 2009Thread-2:Kam 22 Jan 15:42:23 2009Thread-1:Kam 22 Jan 15:42:23 2009Thread-1:Kam 22 Jan 15:42:25 2009Thread-2:Kam 22 Jan 15:42:27 2009Thread-2:Kam 22 Jan 15:42:31 2009Thread-2:Kam 22 Jan 15:42:35 2009

Meskipun sangat efektif untuk threading tingkat rendah, tetapi utas modul sangat terbatas dibandingkan dengan modul threading yang lebih baru.

The Threading Modul

Modul threading yang lebih baru yang disertakan dengan Python 2.4 memberikan dukungan tingkat tinggi yang jauh lebih kuat untuk thread daripada modul thread yang dibahas di bagian sebelumnya.

mengutas modul memperlihatkan semua metode utas modul dan menyediakan beberapa metode tambahan

  • threading.activeCount() Mengembalikan jumlah objek utas yang aktif.

  • threading.currentThread() Mengembalikan jumlah objek utas dalam kontrol utas pemanggil.

  • threading.enumerate() Mengembalikan daftar semua objek utas yang sedang aktif.

Selain metode, modul threading memiliki Utas kelas yang mengimplementasikan threading. Metode yang disediakan oleh Utas kelas adalah sebagai berikut

  • lari() Metode run() adalah titik masuk untuk sebuah thread.

  • mulai() Metode start() memulai thread dengan memanggil metode run.

  • bergabung([waktu]) Join() menunggu thread berakhir.

  • isAlive() Metode isAlive() memeriksa apakah sebuah thread masih dieksekusi.

  • getName() Metode getName() mengembalikan nama thread.

  • setName() Metode setName() menetapkan nama utas.

Membuat Thread Menggunakan Threading Modul

Untuk mengimplementasikan thread baru menggunakan modul threading, Anda harus melakukan hal berikut −

  • Tentukan subkelas baru dari Utas kelas.

  • Ganti __init__(self [,args]) metode untuk menambahkan argumen tambahan.

  • Kemudian, ganti metode run(self [,args]) untuk mengimplementasikan apa yang harus dilakukan utas saat dimulai.

Setelah Anda membuat Utas . yang baru subkelas, Anda dapat membuat turunannya dan kemudian memulai utas baru dengan menjalankan start() , yang pada gilirannya memanggil run() metode.

Contoh

#!/usr/bin/pythonimport threadingimport timeexitFlag =0class myThread (threading.Thread):def __init__(self, threadID, name, counter):threading.Thread.__init__(self) self. threadID =threadID self.name =nama self.counter =counter def run(self):print "Starting" + self.name print_time(self.name, 5, self.counter) print "Exiting" + self.namedef print_time(threadName , counter, delay):while counter:if exitFlag:threadName.exit() time.sleep(delay) print "%s:%s" % (threadName, time.ctime(time.time())) counter -=1 # Buat threadsthread1 baru =myThread(1, "Thread-1", 1)thread2 =myThread(2, "Thread-2", 2)# Mulai Threadsthread1.start baru()thread2.start()print "Keluar dari Thread Utama" 

Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut

Memulai Utas-1Memulai Utas-2Keluar dari Utas UtamaThread-1:Kam 21 Mar 09:10:03 2013Thread-1:Kam 21 Mar 09:10:04 2013Thread-2:Kam 21 Mar 09:10:04 2013Thread-1:Kam 21 Mar 09:10:05 2013Thread-1:Kam 21 Mar 09:10:06 2013Thread-2:Kam 21 Mar 09:10:06 2013Thread-1:Kam 21 Mar 09:10:07 2013Keluar dari Thread-1Thread-2:Kam 21 Mar 09:10:08 2013Thread-2:Kam 21 Mar 09:10:10 2013Thread-2:Kam 21 Mar 09:10:12 2013Keluar dari Thread-2

Menyinkronkan Utas

Modul threading yang disediakan dengan Python mencakup mekanisme penguncian sederhana yang memungkinkan Anda untuk menyinkronkan utas. Kunci baru dibuat dengan memanggil Lock() metode, yang mengembalikan kunci baru.

memperoleh(memblokir) metode objek kunci baru digunakan untuk memaksa utas berjalan secara sinkron. pemblokiran opsional parameter memungkinkan Anda untuk mengontrol apakah utas menunggu untuk mendapatkan kunci.

Jika memblokir diatur ke 0, utas segera kembali dengan nilai 0 jika kunci tidak dapat diperoleh dan dengan 1 jika kunci diperoleh. Jika pemblokiran diatur ke 1, utas akan memblokir dan menunggu kunci dilepaskan.

rilis() metode objek kunci baru digunakan untuk melepaskan kunci saat tidak lagi diperlukan.

Contoh

#!/usr/bin/pythonimport threadingimport timeclass myThread (threading.Thread):def __init__(self, threadID, name, counter):threading.Thread.__init__(self) self.threadID =threadID self.name =nama self.counter =counter def run(self):print "Starting" + self.name # Dapatkan kunci untuk menyinkronkan thread threadLock.acquire() print_time(self.name, self.counter, 3) # Gratis lock untuk melepaskan thread berikutnya threadLock.release()def print_time(threadName, delay, counter):while counter:time.sleep(delay) print "%s:%s" % (threadName, time.ctime(time.time() )) counter -=1threadLock =threading.Lock()threads =[]# Buat threadsthread1 baru =myThread(1, "Thread-1", 1)thread2 =myThread(2, "Thread-2", 2)# Mulai baru Threadsthread1.start()thread2.start()# Tambahkan utas ke daftar utasthreads.append(thread1)threads.append(thread2)# Tunggu hingga semua utas selesai untuk t di utas:t.join()print "Exiting Main Thread" 

Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut

Memulai Thread-1Memulai Thread-2Thread-1:Kam 21 Mar 09:11:28 2013Thread-1:Kam 21 Mar 09:11:29 2013Thread-1:Kam 21 Mar 09:11:30 2013Thread-2:Kam 21 Mar 09:11:32 2013Thread-2:Kam 21 Mar 09:11:34 2013Thread-2:Kam 21 Mar 09:11:36 2013Keluar dari Thread Utama

Antrian Prioritas Multithread

Antrian module memungkinkan Anda membuat objek antrian baru yang dapat menampung sejumlah item tertentu. Ada metode berikut untuk mengontrol Antrian −

  • dapatkan() Get() menghapus dan mengembalikan item dari antrian.

  • menempatkan() Put menambahkan item ke antrian.

  • qsize() qsize() mengembalikan jumlah item yang sedang dalam antrian.

  • kosong() The empty() mengembalikan True jika antrian kosong; jika tidak, Salah.

  • penuh() full() mengembalikan True jika antrian penuh; jika tidak, Salah.

Contoh

#!/usr/bin/pythonimport Queueimport threadingimport timeexitFlag =0class myThread (threading.Thread):def __init__(self, threadID, nama, q):threading.Thread.__init__(self) .threadID =threadID self.name =nama self.q =q def run(self):print "Starting" + self.name process_data(self.name, self.q) print "Exiting" + self.namedef process_data(threadName, q):sementara tidak exitFlag:queueLock.acquire() jika bukan workQueue.empty():data =q.get() queueLock.release() print "%s processing %s" % (threadName, data) else:queueLock. release() time.sleep(1)threadList =["Thread-1", "Thread-2", "Thread-3"]nameList =["Satu", "Dua", "Tiga", "Empat", " Five"]queueLock =threading.Lock()workQueue =Queue.Queue(10)threads =[]threadID =1# Buat thread baru untuk tName di threadList:thread =myThread(threadID, tName, workQueue) thread.start() thread. append(thread) threadID +=1# Isi queuequeueLock.acquire()untuk kata di nameList:workQueue.put(word)queueLock.releas e()# Tunggu antrian kosong saat tidak bekerjaQueue.empty():pass# Beritahu utas saatnya untuk keluarexitFlag =1# Tunggu semua utas selesaiuntuk t di utas:t.join()print "Exiting Main Thread" 

Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut

Memulai Utas-1Memulai Utas-2Memulai Pemrosesan Utas-3Thread-1 Pemrosesan OneThread-2 Pemrosesan TwoThread-3 Pemrosesan ThreeThread-1 Pemrosesan FourThread-2 FiveExiting Thread-3Uang Keluar-1Uang Keluar-2Utas Utama Keluar 

Python

  1. Fungsi &Metode Utama Python Contoh:Memahami def Main()
  2. Python Attrs:Kelas Data Tingkat Lanjut, Dengan Kode Contoh
  3. Python Namespace and Scope
  4. Python String count() dengan CONTOH
  5. Warisan Python
  6. Tutorial PyQt5 dengan Contoh:Mendesain GUI menggunakan PyQt dengan Python