多线程 - python多个线程锁可提高效率吗?
阿神
阿神 2017-04-17 17:36:49
0
5
551

[修改部分内容,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多线程开源项目,想阅读学习一下!

阿神
阿神

闭关修行中......

membalas semua(5)
巴扎黑

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.

Ty80

Pertama sekali, multi-threading Python itu sendiri adalah 效率极低 kerana keterbatasan mekanisme GIL(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 dunia multiprocessing...

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 Pythonberbilang 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.

阿神
  1. Anda tidak memerlukan kunci untuk membuka fail yang berbeza

  2. 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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan