[修改部分内容,sorry有两点原来我没有讲清楚,我重新修改了示例代码
1 使用多线程是因为网络IO
2 下面的三个资源都是线程共享的,所以要加锁
]
优化多线程的效率问题
原先的多线程结构如下:
建立一个锁,所有不安全的函数都用这个锁
class():
self.lock = threading.lock()
def out_to_file1(self): #第一个资源
self.lock.acquire()
f = open(file1)
f.write()
f.close()
self.lock.release()
def out_to_file2(self): #第二个资源
self.lock.acquire()
f = open(file2)
f.write()
f.close()
self.lock.release()
def update_scan_count(self): #第三个资源
self.lock.acquire()
self.scan_count += 1
self.lock.release()
def _scan(self): #每个线程的内部逻辑
while self.queue.qsize() > 0 and self.is_continue:
...
此处代码为处理网络IO(我使用多线程的原因)
...
out_to_file2()
update_scan_count()
out_to_file1()
def main(self):
for i in range():
t = threading.Thread(target=self._scan, name=str(i))
setdaemon
t.start()
t.join()
现在考虑建立三个锁
lock1 = threading.lock()
lock2 = threading.lock()
lock3 = threading.lock()
分别锁住这三个资源
请问这样的效率会提高吗?有其他好的建议吗?多谢!
PS:求提供一些优秀的py多线程开源项目,想阅读学习一下!
Adalah disyorkan untuk menggunakan baris gilirBaris gilir untuk pemprosesan. Python3 mula mempunyai modul concurrect.futures berpakej, yang boleh menggunakan berbilang benang dan berbilang proses seperti fungsi biasa.
Pertama sekali, multi-threading
Python
itu sendiri adalah效率极低
kerana keterbatasan mekanismeGIL(Global Interpreter Lock:全局解释锁)
Fungsinya hanya:对于一个解释器,只能有一个线程在执行bytecode。
Jadi jika anda ingin mengejar kecekapan berbilang benang dalam erti kata tradisional, mari kita gunakan pelbagai proses (
Python
) di duniamultiprocessing
...Di sini anda menggunakan multi-threading dan menggunakan kunci untuk mengawal sumber awam Pertama sekali, mengunci perkara ini akan menyebabkan kebuntuan Tanpa penguncian, tiada risiko kebuntuan, tetapi akan berlaku masalah penyegerakan.
Selain itu, jika urutan yang berbeza mengendalikan fail yang berbeza, tiada masalah penyegerakan Jika fail yang sama dikendalikan, saya syorkan menggunakan
Queue
(baris gilir) untuk mengendalikannya.Secara umum, lebih baik menggunakan satu utas, kerana
Python
berbilang benang itu sendiri tidak cekap, dan tidak perlu mempertimbangkan isu penyegerakan dengan satu utas. Jika anda mesti mengejar kecekapan, gunakan berbilang proses kunci proses juga mesti dipertimbangkan.Anda tidak memerlukan kunci untuk membuka fail yang berbeza
Anda tidak memerlukan kunci untuk membuka fail yang sama
Kecekapan kunci adalah sangat rendah. Cuba tukar "kunci" kepada "selari/baris".
Tidak, berbilang benang/mengunci dan seumpamanya akan mengurangkan prestasi, hanya pemprosesan tak segerak berbenang tunggal akan meningkatkan prestasi
Ini boleh menyebabkan keadaan kebuntuan permintaan pemilikan dengan mudah dan syarat lain (eksklusif, tidak boleh didahulukan, permintaan pekeliling) akan menyebabkan kebuntuan. Dan kunci mengukuhkan keselamatan data, tetapi prestasi pasti akan berkurangan.