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

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

阿神
阿神

闭关修行中......

全員に返信 (5)
巴扎黑

建议使用队列Queue来处理。Python3开始有封装好的concurrect.futures模块,可以像普通函数一样使用多线程,多进程。

いいねを押す+0
    Ty80

    首先,Python的多线程本身就是效率极低的,因为有GIL(Global Interpreter Lock:全局解释锁)机制的限制,其作用简单说就是:对于一个解释器,只能有一个线程在执行bytecode。
    所以如果为了追求传统意义上多线程的效率,在Python界还是用多进程(multiprocessing)吧……

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

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

    总的来说,用单线程就好了,因为Python多线程本身就没什么效率,而且单线程也不用考虑同步问题了。非要追求效率的话,就用多进程吧,同样也要考虑进程锁。

    いいねを押す+0
      阿神
      1. 你打开不同的文件不需要锁

      2. 你打开相同的文件不需要锁

      锁的效率很低,尽量把『锁』改为『并行/队列』。

      いいねを押す+0
        迷茫

        不能,多线程/锁之类的都会降低性能, 只有单线程异步处理才会提高性能

        いいねを押す+0
          伊谢尔伦

          这样很容易造成占有-请求的死锁条件,当其他条件(独占,不可抢占,循环请求)就会造成死锁。并且锁加强了数据安全型,但是性能必然会下降。

          いいねを押す+0
            最新のダウンロード
            詳細>
            ウェブエフェクト
            公式サイト
            サイト素材
            フロントエンドテンプレート
            私たちについて 免責事項 Sitemap
            PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!