Python控制异步线程数量
本文最后更新于 481 天前,其中的信息可能已经有所发展或是发生改变。

前一阵子 @Charlotte 想要帮别人做一个刷票的东西,在这个过程中遇到了需要代理的问题,于是在没有告诉他的情况下,我开始写一个代理管理系统,现在已经写得差不多了。目的是能够自动抓取代理入库并分析数据库中的代理是否有效,根据连接速度排序等待使用。

在这个过程中遇到了一个问题,我使用回显(Ping)的方式来确定代理服务器的速度(不考虑某些代理禁Ping),但是通过subprocess同时只能回收一条IP的信息,于是我决定使用多线程。

在使用多线程的过程中,我遇到了和以前写百度的那个版本管理系统一样的问题:控制线程数量。

为什么说是异步的呢?我有一个任务队列,在这个多线程的环境下,每个线程在保证线程安全的情况下去拿任务做,任务完成后回收数据,并且不用等待其他线程(在我的这个任务中没有必要等待)去拿新的任务,如此循环。

我在之前的软件中用了这样一个办法,我把所有的线程都找出来,分析这个软件从前台到后台的所有可能的线程数量,如此运算:

while not con.empty():
    if threading.activeCount() > threadNum*2+1:
        continue
    if clear:
        while threading.activeCount() > 3:
            insert_console_end("Waitting retrieve threading...\n")
            time.sleep(0.5)
        while not con.empty:
            con.get_nowait() 
        while not message_queue.empty():
            message_queue.get_nowait()
        while len(has_found) != 0:
            has_found = []
        clear = False
        stop_Button['state'] = "disabled"
        return False

现在看来,这真的是一个很蠢的办法。

于是我在这个地方做了如下改进:
我创建一个线程队列(类似于栈),但是这个线程队列中并不存储线程对象,而是在早之前就已经创建,只是没有运行,让每个线程在出栈时初始化。

那么我们这个队列中存什么呢?

随便存什么都行,只要不爆栈就可以。

这样我们利用队列的特性,可以实现出一个类似于锁同步的东西。
怎么做呢,我们在让线程在初始化或者运行之前尝试从队列中拿东西(你随便存入的)能拿到的就可以跑,否则就被阻塞,直到其他的线程执行完毕,向栈中压入数据时才可以。

8线程

这样我们就可以严格的控制住最大的线程数量,效果:我设置了8个最大线程数,基本上最少都是在7个跑,一般在8个,但是绝对不会超过。

我通过给初始化线程命名的方式,所以队列中压入的就是几个线程号(1,2,3,4····),部分代码:

thread_id = self.thread_queue.get()
newth = threading.Thread(target = self.gapping, name = 'TestGap-' + str(thread_id),args = (ip, thread_id))
newth.start()

说不定将来会找到更好的方法。

听首歌休息下,去学吉他:

评论

  1. Charlotte
    4年前
    2016-7-27 23:31:53

    有劳了。。。我查了下网上代理服务器可用性差是因为多数为蜜罐,因此仅仅ping是无法断定可用性的,我觉得可以试试用socket来connect百度。。。

    • 桂 QQ 博主
      4年前
      2016-7-28 8:52:48

      已经在写这个东西了~

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇