吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1460|回复: 4
收起左侧

[Python 转载] Python利用Semaphore控制线程数量

[复制链接]
香谢枫林 发表于 2020-2-27 11:11
本帖最后由 香谢枫林 于 2020-2-27 11:25 编辑

最近写Python需要用到线程,考虑到机器性能和网站访问限制情况,又不能使用太多的限制,所以研究了下线程控制,在此分享给大家。
使用起来很简单,利用Semaphore控制线程需要用到3个函数:
sem = threading.Semaphore(4) # 限制线程的最大数量为4个(控制线程数量)
sem.acquire() # 获得线程,可用线程数减1(获取线程)
sem.release() # 释放线程数,线程数加1(释放线程)

[Python] 纯文本查看 复制代码
import threading,time,random
def get_num(i,sem):
    sleeptime = random.randint(1,5)
    print("开始第"+str(i)+"个线程:"+str(sleeptime)+"秒")
    time.sleep(sleeptime)
    sem.release()  # 释放线程数,线程数加1
    print("~结束第" + str(i) + "个线程")
    return

def main():
    sem = threading.Semaphore(4)  # 限制线程的最大数量为4个
    for i in range(1,10):
        sem.acquire()  # 获得线程,可用线程数减1
        # th = threading.Thread(target=get_num,args=(i, sem))   #给执行函数传递值
        # th.start()    #执行函数
        threading.Thread(target=get_num, args=(i, sem)).start() #给执行函数传递值,包括sem线程锁,并执行函数

if __name__ ==  "__main__":
    main()



这个程序是模拟线程执行,模拟9个线程,每个线程执行时利用sleep随机时间模拟执行时间,执行结果如下: WX20200227-110954@2x.png
执行结果符合预期!

免费评分

参与人数 2吾爱币 +3 热心值 +2 收起 理由
M87 + 1 + 1 我很赞同!
Ldfd + 2 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Nelson_saberbin 发表于 2020-2-27 11:40
cpython解释器的线程没多大意义吧,如果是想提高效率不如用协程,但是我看你是想限制爬取的频率,这个多线程还不如用单线程吧
 楼主| 香谢枫林 发表于 2020-2-27 11:44
Nelson_saberbin 发表于 2020-2-27 11:40
cpython解释器的线程没多大意义吧,如果是想提高效率不如用协程,但是我看你是想限制爬取的频率,这个多线 ...

对于爬取一些网站、论坛的数据,单线程比较慢,多线程需要控制频率,不然容易被封号,所以才有线程控制的需要。
Too灬快乐 发表于 2020-2-27 11:56
知意执意 发表于 2020-2-27 12:52
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 03:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表