天天看點

python多線程下載下傳音樂

'''
Description:
Author: pdh
Date: 2020-11-05 12:12:22
LastEditors: pdh
LastEditTime: 2020-11-06 14:47:55
FilePath: \down\down.py
'''
# coding=utf-8

import os
import requests
from concurrent.futures import ThreadPoolExecutor
import threading
import asyncio

gLock = threading.Lock()
gPool = ThreadPoolExecutor(50)


def pinfo(text):
    global gLock
    gLock.acquire()
    print(text)
    gLock.release()


async def downOne(name, loop):
    urlPrefixArr = (
        "http://mp3-2e.xxx.com:9090",
        "http://mp32a.xxxx.com:9090",
        "http://mp33a.x.com:9090",
        "http://mp3-e.xxxx.com:9090",
        "http://mp3-2f.xxxx.com:9090",
        "http://mp3-d.xxx.com:9090",
        "http://mp32b.xxx.com:9090",
        "http://mp3f.xxxx.com:9090",
        "http://mp33b.xxx.com:9090",
        "http://mp3-f.xxxx.com:9090",
        "http://mp3-2.xxxx.com:9090",
        "http://mp3d.xxxx.com:9090"
    )

    global gPool
    prefixs = []

    prefixs.append(name)
    prefixs.append(name+"(完)")
    if True:
        for pre in prefixs:
            name = pre + ".mp3"
            for urlPre in urlPrefixArr:
                for big in range(2016, 2020):
                    for sub in range(51, 60):
                        if os.path.isfile(name):
                            return name, True
                        url = "/".join((urlPre, str(big),
                                        str(sub), "曹賊", name))
                        pinfo("downOne:start {}, {}".format(name, url))

                        result = await loop.run_in_executor(gPool, requests.get, url)
                        if result.status_code == 200:
                            with open(name, "wb") as f:
                                f.write(result.content)
                                pinfo("downOne:ok {},  {}".format(name, url))

                            return name, True
                        else:
                            pinfo("downOne:fail url={}".format(url))
                        await asyncio.sleep(0.01)
    else:
        for pre in prefixs:
            name = pre + ".mp3"
            for urlPre in urlPrefixArr:
                if os.path.isfile(name):
                    return name, True
                url = "/".join((urlPre, "都市言情/草房子_林慧", name))
                pinfo("downOne:start {}, {}".format(name, url))

                result = await loop.run_in_executor(gPool, requests.get, url)
                if result.status_code == 200:
                    with open(name, "wb") as f:
                        f.write(result.content)
                        pinfo("downOne:ok {},  {}".format(name, url))

                    return name, True
                else:
                    pinfo("downOne:fail url={}".format(url))
                await asyncio.sleep(0.01)

    return name, False


def getAll():
    fs = []

    if False:
        [str(f).zfill(2) for f in range(1, 39)]
    else:
        with open("down_multi.txt", "r", encoding="utf-8") as f:
            while True:
                line = f.readline()
                if line:
                    n = line.strip()
                    if n:
                        pinfo(n)
                        fs.append(n)
                else:
                    break
    return fs


async def downAll(loop):
    fs = []
    names = getAll()
    for name in names:
        task = asyncio.ensure_future(downOne(name, loop))
        fs.append(task)

    pinfo("downAll:wait")
    rs = await asyncio.gather(*fs)
    # pinfo("downAll:waiting {}".format(rs))
    pinfo("downAll:wait end")
    return rs


def deal():
    loop = asyncio.get_event_loop()
    try:

        rs = loop.run_until_complete(downAll(loop))
        count = 0
        for name, success in rs:
            if success:
                count += 1
                pinfo("name = {}, success= {}".format(name, success))
            else:
                print("faile name={}".format(name))
        pinfo("成功下載下傳: count = {}".format(count))
    finally:
        loop.close()


if __name__ == "__main__":
    deal()

    pinfo("main:middle")

    while True:
        line = input("輸入")
        if (line == 'q'):
            break