搜尋

首頁  >  問答  >  主體

多线程 - python多个线程锁可提高效率吗?

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

阿神阿神2889 天前577

全部回覆(5)我來回復

  • 巴扎黑

    巴扎黑2017-04-17 17:38:49

    建議使用隊列Queue來處理。 Python3開始有封裝好的concurrect.futures模組,可以像普通函數一樣使用多線程,多進程。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 17:38:49

    首先,Python的多執行緒本身就是效率極低的,因為有GIL(Global Interpreter Lock:全域解釋鎖)機制的限制,其作用簡單說就是:對於一個解釋器,只能有一個執行緒在執行bytecode。
    所以如果為了追求傳統意義上多執行緒的效率,在Python界還是用多進程(multiprocessing)吧…Python的多线程本身就是效率极低的,因为有GIL(Global Interpreter Lock:全局解释锁)机制的限制,其作用简单说就是:对于一个解释器,只能有一个线程在执行bytecode。
    所以如果为了追求传统意义上多线程的效率,在Python界还是用多进程(multiprocessing)吧……

    这里你用了多线程,且用了锁来控制公共资源,首先锁这个东西会导致死锁,不加锁反而没有死锁隐患,但会有同步问题。

    另外,如果不同线程操作的是不同的文件,是不存在同步问题的,如果操作同一个文件,我建议采用Queue(队列)来处理。

    总的来说,用单线程就好了,因为Python

    這裡你用了多線程,且用了鎖來控制公共資源,首先鎖這個東西會導致死鎖,不加鎖反而沒有死鎖隱患,但會有同步問題。 🎜 🎜另外,如果不同線程操作的是不同的文件,是不存在同步問題的,如果操作同一個文件,我建議採用Queue(隊列)來處理。 🎜 🎜總的來說,用單線程就好了,因為Python多線程本身就沒什麼效率,而且單線程也不用考慮同步問題了。非要追求效率的話,就用多進程吧,同樣也要考慮進程鎖。 🎜

    回覆
    0
  • 阿神

    阿神2017-04-17 17:38:49

    1. 你打開不同的檔案不需要鎖定

    2. 你打開相同的檔案不需要鎖定

    鎖的效率很低,盡量把『鎖』改為『並行/隊列』。

    回覆
    0
  • 迷茫

    迷茫2017-04-17 17:38:49

    不能,多執行緒/鎖之類的都會降低效能, 只有單執行緒非同步處理才會提高效能

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:38:49

    這樣很容易造成佔有-請求的死鎖條件,當其他條件(獨佔,不可搶佔,循環請求)就會造成死鎖。而且鎖定加強了資料安全型,但是效能必然會下降。

    回覆
    0
  • 取消回覆