Saya mencoba menggunakan utas python dan saya mengalami masalah dalam membuat utas bekerja secara mandiri. Mereka tampaknya berjalan secara berurutan dan menunggu satu selesai sebelum mulai memproses utas berikutnya. Saya telah membaca posting lain yang menyarankan bahwa saya perlu mendapatkan lebih banyak pekerjaan ke dalam utas untuk membedakan pekerjaan CPU yang sebenarnya vs pekerjaan CPU untuk memulai dan mengelola utas, dan bahwa pengatur waktu tidur dapat digunakan untuk mensimulasikan ini. Jadi saya mencobanya dan kemudian mengukur durasi tugas.

Jadi kode saya di bawah ini. Ini pertama menjalankan tiga tugas secara berurutan dengan timer 2 detik. Ini membutuhkan waktu sekitar 6 detik untuk berjalan seperti yang diharapkan. Bagian selanjutnya memulai tiga utas dan mereka harus berjalan secara paralel jika pemahaman saya tentang utas benar. Saya telah bermain dengan penghitung waktu untuk menguji durasi keseluruhan dari bagian kode ini, berharap bahwa jika satu penghitung waktu lebih besar dari dua lainnya, kode akan dieksekusi dalam interval yang paling dekat dengan yang lebih besar. tapi apa yang saya lihat adalah mengambil jumlah waktu yang sama seperti tiga berjalan secara berurutan - satu demi satu.

Saya melakukan ini karena saya menulis beberapa kode untuk membaca antrian asinkron di latar belakang. Setelah meluncurkan utas untuk membaca antrian, kode saya tampaknya berhenti dan menunggu sampai pembaca antrian dihentikan, yang biasanya tidak karena menunggu pesan masuk. Jadi yang terjadi adalah ia tidak pernah mengeksekusi bagian berikutnya dari kode dan sepertinya menunggu utas selesai.

Saya juga memeriksa jumlah utas yang aktif dan tetap pada nomor yang sama, dan ketika saya memeriksa ID utas dalam kode (tidak ditampilkan) saya mendapatkan nomor utas yang sama kembali untuk setiap utas.

Saya baru mengenal python dan saya menggunakan lingkungan kompiler jupyter. Apakah ada opsi kompilasi atau batasan lain yang tidak saya ketahui yang mencegah threading? Apakah saya hanya tidak mendapatkan konsep? Saya tidak percaya bahwa ini terkait dengan inti CPU/threading karena akan dilakukan melalui inti utas logis dalam kode yang dikompilasi python. Saya juga menjalankan program serupa di lingkungan shell perintah dan mendapatkan kinerja sekuensial yang sama.

Potong dan tempel kode ini untuk melihat fungsinya. Apa yang saya lewatkan?

'''

import threading 
import logging
import datetime 
import time 
import random 

class Parallel: 
    
    def work(self, interval): 
        time.sleep(interval)
        name = self.__repr__()
        print (name, " is complete after ", interval, " seconds")
 


# SetupLogger()
logging.getLogger().setLevel(logging.DEBUG)
logging.debug("thread program start time is %s", datetime.datetime.now())


thread1 = Parallel()
thread2 = Parallel()
thread3 = Parallel()

print ("sequential threads::")
thread1.work(2.0)
thread2.work(2.0)
thread3.work(2.0)

logging.info("parallel threads start time is %s ", datetime.datetime.now())
start = time.time()

work1 = threading.Thread(target=thread1.work(1), daemon=True) 
work1.start()
print ("thread 1 is started and there are ", threading.activeCount(), " threads active")

work2 = threading.Thread(target=thread2.work(2), daemon=False)
work2.start()
print ("thread 2 is started and there are ", threading.activeCount(), " threads active")

work3 = threading.Thread(target=thread3.work(5), daemon=False)
work3.start()
print ("thread 3 is started and there are ", threading.activeCount(), " threads active")

# wait for all to complete 
print ("now wait for all to finish at ", datetime.datetime.now())
work1.join()
work2.join()
work3.join()
end = time.time()
logging.info ("parallel threads end time is %s with %s elapsed", datetime.datetime.now(), str(end-start))

print ("all threads completed at:", datetime.datetime.now())
    

'''

0
Jimbo 17 Mei 2021, 14:10

1 menjawab

Jawaban Terbaik

Di baris yang menginisialisasi utas, Anda sebenarnya menjalankan fungsi alih-alih meneruskan referensinya ke utas.

Thread1.work() ----> ini benar-benar akan menjalankan fungsi ketika program berjalan dan menemukan pernyataan ini Jadi ketika program Anda mencapai baris ini,

work1 = threading.Thread(target=thread1.work(1), daemon=True)

Dan bertemu target=thread1.work(1), itu hanya memanggil fungsi di sana dan utas yang sebenarnya tidak melakukan apa-apa.

Thread1.work adalah referensi ke fungsi, yang harus Anda teruskan ke objek Thread Anda. Jadi hapus saja tanda kurung dan kode Anda menjadi

work1 = threading.Thread(target=thread1.work, daemon=True, args=(1,))

Dan ini akan berperilaku seperti yang Anda harapkan.

1
JackX 18 Mei 2021, 09:00