美文网首页
11-5 控制线程数量

11-5 控制线程数量

作者: 正在努力ing | 来源:发表于2018-08-26 15:40 被阅读0次

   多线程编程中,有时候一个数据,只能有一个线程进行“写”;但是可以有多个线程进行“读” ;

怎样控制只有一个线程写呢?

解决 用threading中的Semaphore

使用方法

from threading import Thread,Semaphore
import time

class gethtml(Thread):
    def __init__(self,sem,url):
        self.sem = sem
        self.url = url
        super(gethtml, self).__init__(name="小爱同学")

    def run(self):
        time.sleep(2)
        print(self.url)
        self.sem.release()   # 4 永远要记得释放锁

def mypass(sem):
    for i in range(20):
        sem.acquire()  # 3 永远要记得落锁
        th = gethtml(sem, i)
        th.start()
        
# 1 实例化
sem = Semaphore(3)

# 2 丢到线程里,变成线程实例的一个属性
thread = Thread(target=mypass,args=(sem,))
thread.start()

>>> 
0
1
2
---
3
4
5
....

  • 实例sem = Semaphore(3) 是控制线程只有三个,本质是会变成实例中self._value = 3 语句
  • 每一个sem.acquire() 执行 ,就证明有一个线程落锁了,所以self._value - 1;
  • 当 value变成0 就会一直等待,等待原来的线程执行完毕后sem.release()解锁掉,此时self.value + 1;又可以放进来新得线程了

改进,把他们全部类化

from threading import Thread,Semaphore

import time


class gethtml(Thread):
    def __init__(self,sem,url):
        self.sem = sem
        self.url = url
        super(gethtml, self).__init__(name="小爱同学")

    def run(self):
        time.sleep(2)
        print(self.url)
        self.sem.release()


class geturl(Thread):
    def __init__(self,sem):
        self.sem = sem
        super().__init__(name="天猫精灵")

    def run(self):
        for i in range(20):
            self.sem.acquire()
            th = gethtml(self.sem,i)
            th.start()

if __name__ == "__main__":

    sem3 = Semaphore(3)
    thread = geturl(sem3)
    thread.start()

相关文章

  • 11-5 控制线程数量

       多线程编程中,有时候一个数据,只能有一个线程进行“写”;但是可以有多个线程进行“读” ; 怎样控制只有一个线...

  • GCD控制线程数量

    1.GCD控制线程数量 2.GCD控制线程数量+线程任务结束通知处理

  • GCD进阶

    GCD 控制线程数量 GCD 不像NSOperation 那样有直接提供线程数量控制方法,但是通过GCD的sema...

  • python多线程并发数量控制

    python多线程如果不进行并发数量控制,在启动线程数量多到一定程度后,会造成线程无法启动的错误。控制多线程并发数...

  • 对于线程池的理解

    线程池的作用:控制线程的数量,处理过程中把任务放到队列中,然后在线程创建后启动这些任务。如果线程数量超过了最大数量...

  • 聊聊Java线程池那些事

    为什么使用线程池 线程池作用就是通过限制系统中执行线程的数量从而达到优化资源分配的目的。 控制执行线程的数量 假如...

  • JAVA控制线程并发数量

    JAVA控制线程并发数量方法主要有,限制一个线程使用(synchronized),限制指定数量的线程并发使用(Se...

  • JUC-ThreadPool

      线程池:控制运行的线程数量,底层是阻塞队列。 线程复用(降低资源损耗) 控制最大并发数(提高响应速度) 管理线...

  • 简单易懂的DispatchSemaphore

    DispatchSemaphore 信号量,一种用来控制并发访问资源的机制,多用于多线程中,可以控制并发线程数量。...

  • Java线程池原理

    线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过...

网友评论

      本文标题:11-5 控制线程数量

      本文链接:https://www.haomeiwen.com/subject/mcyoiftx.html