Pemrograman multitasking Python - berbagi variabel antar thread

Tag Terkait:1. Berdayakan Web Anda dengan Python
2. Shodan dan Python API

Masalah: Error saat berbagi data variabel global antar thread



import threading

g_num = 0


def task1 ():
for i in range ( 1000000 ):
global g_num
g_num += 1
print ( 'TASK1:' , g_num )

def task2 ():
for i in range ( 1000000 ):
global g_num
g_num += 1
print ( 'TASK2:' , g_num )


if __name__ == "__main__" :
first = threading.Thread ( target = task1 ) _ _
second = threading.Thread ( target = task2 ) _ _
first.start ( ) _
second.start ( ) _


hasil operasi:




Secara teori, 1 juta loop diimplementasikan, dan 1 ditambahkan ke variabel global setiap kali loop dieksekusi, sehingga hasil akhirnya seharusnya 2.000.000. Hasil aktual ditunjukkan di atas.

alasan:



Dua thread beroperasi pada variabel global secara bersamaan. Saat thread 1 membaca variabel global, thread 2 juga membaca variabel global. Saat melakukan operasi pada variabel, variabel asli yang dibaca, bukan variabel setelah operasi. Karena thread 1 belum melakukan commit setelah operasi pada variabel, thread 2 juga membaca nilai variabel sebelumnya.
Solusi

Gunakan sinkronisasi proses untuk memastikan bahwa hanya satu thread yang beroperasi pada data dalam satu waktu.

1. Gunakan metode join()

import threading

g_num = 0


def task1 ():
for i in range ( 1000000 ):
global g_num
g_num += 1
print ( 'TASK1:' , g_num )

def task2 ():
for i in range ( 1000000 ):
global g_num
g_num += 1
print ( 'TASK2:' , g_num )


if __name__ == "__main__" :
first = threading.Thread ( target = task1 ) _ _
second = threading.Thread ( target = task2 ) _ _
first.start ( ) _
first.join ( ) _
second.start ( ) _
Hasilnya:



Prinsip: Thread first.join() ditambahkan untuk menunggu saat program berjalan, dan thread kedua akan mulai berjalan setelah thread pertama selesai, memastikan bahwa hanya satu thread yang beroperasi pada variabel dalam satu waktu.
Sinkronisasi thread: Setelah satu tugas dieksekusi, tugas lain dapat dieksekusi, dan hanya satu tugas yang dieksekusi dalam satu waktu.

2. Mutex

import threading

g_num = 0

# Membuat mutex pada dasarnya adalah fungsi melalui
LOCK = threading.Lock ( ) _
def task1 ():
# kunci
LOCK.acquire ( ) _
for i in range ( 1000000 ):
global g_num
g_num += 1
print ( 'TASK1:' , g_num )
# lepas kunci
LOCK.release ( ) _


def task2 ():
LOCK.acquire ( ) _
for i in range ( 1000000 ):
global g_num
g_num += 1
print ( 'TASK2:' , g_num )
LOCK.release ( ) _


if __name__ == "__main__" :
first = threading.Thread ( target = task1 ) _ _
second = threading.Thread ( target = task2 ) _ _
first.start ( ) _
second.start ( ) _

Hasil:





Prinsip: Untuk penguncian data bersama, hanya satu thread yang beroperasi dalam satu waktu, dan beberapa thread memperebutkannya bersama, dan fungsi lock di threading digunakan terlebih dahulu untuk mendapatkannya. Saat menjalankan thread pertama, kunci thread saat ini terlebih dahulu dengan lock.acquire(), selama itu thread lain tidak dapat berjalan. Saat loop berakhir, gunakan lock.release() untuk melepaskan thread saat ini, setelah itu thread lain dapat beroperasi. Pastikan bahwa hanya thread yang sama yang berjalan dalam satu waktu.
Namun, kunci mutex memengaruhi efisiensi kode sampai batas tertentu, mengubah multitasking menjadi eksekusi tugas tunggal, dan juga dapat menyebabkan masalah deadlock (disebabkan oleh kurangnya pelepasan kunci tepat waktu).

Pernyataan hak cipta: Konten artikel ini disumbangkan oleh pengguna terdaftar nama asli Alibaba Cloud. Hak cipta milik penulis asli. Komunitas developer Alibaba Cloud tidak memiliki hak cipta dan tidak menanggung tanggung jawab hukum yang sesuai. Untuk aturan spesifik, silakan lihat "Perjanjian Layanan Pengguna Komunitas Developer Alibaba Cloud" dan "Pedoman Perlindungan Kekayaan Intelektual Komunitas Developer Alibaba Cloud". Jika Anda menemukan konten yang diduga plagiarisme di komunitas ini, isi formulir keluhan pelanggaran untuk melaporkannya. Setelah diverifikasi, komunitas ini akan segera menghapus konten yang diduga melanggar.

Artikel Terkait

Jelajahi Lebih Banyak Penawaran Spesial

  1. Short Message Service (SMS) & Layanan Email

    Paket 50.000 email mulai dari harga serendah USD 1,99, 120 pesan singkat mulai dari hanya USD 1,00

phone Hubungi Kami
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.