python 程序中的多线程对我不起作用,可能是什么问题?[duplicate]

b09cbbtk  于 2023-01-04  发布在  Python
关注(0)|答案(1)|浏览(320)
    • 此问题在此处已有答案**:

With "args" vs without "args" to pass arguments to a thread in Python(1个答案)
十小时前关门了。
我正在尝试使用python在一个服务器上自动注册我的帐户。我决定求助于多线程。我在控制台中输入了我需要的线程数,但是它们不是异步启动的。首先,第一个线程完成它的工作,然后第二个线程启动,以此类推。结果,这样的程序工作得非常慢,如何解决这个问题?
〈---启动多线程(这里我将登录基数拆分为线程数,每个线程最多100/10 = 10个登录,并将它们转移到线程本身)---〉

for v in range(int(thread_count)):
        if(lines[v]):
            worker = Thread(target=sendRequest(v, lines[v], proxies, proxy_type))
            threads.append(worker)

    for x in threads:
        x.start()

〈---对于传递给流的每一行,我创建一个异步请求---〉

def sendRequest(th_count, names, proxy, proxy_type):
    for x in names:
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            res = loop.run_until_complete(register(x, proxy, proxy_type, th_count))
            loop.close()

〈---发送get请求的函数如下---〉

async def checking(name, proxy_array, proxy_type, th):
    random_proxy = proxy_array[random.randint(0, len(proxy_array) - 1)].rstrip()
    if proxy_type == 0:
        prox = f'socks4://{random_proxy}'
        proxies = {
            'http': prox,
            'https': prox
        }
    elif proxy_type == 1:
        prox = f'socks5://{random_proxy}'
        proxies = {
            'http': prox,
            'https': prox
        }
    try:
        r = requests.get("https://www.google.com/", proxies=proxies, timeout=3)
        print(f'{th} - {r}')
    except:
        print('err')

我什么都试过了,但是它仍然工作得很长,我不知道我做错了什么。但是线程不想同时运行

8cdiaqws

8cdiaqws1#

你有一部分:

...
            worker = Thread(target=sendRequest(v, lines[v], proxies, proxy_type))
            ...

Thread初始化器的第一个参数应该是对"worker"函数的引用,在本例中是sendRequest,您希望多线程的参数,而其余参数将是在线程启动后传递给辅助函数的实际参数。* args * 关键字参数用于传递要传递给辅助函数的所有位置参数的一个 * iterable *,以及 * kwargs * keyword arguments用于传递一个字典,其中包含关键字参数名称和值,这些名称和值将作为关键字参数传递给辅助函数。
您所做的只是将单个参数传递给Thread初始值设定项,该参数是在当前线程 * 中调用sendRequest(v, lines[v], proxies, proxy_type) * 的返回值。此返回值似乎是None,它查看sendRequest的函数定义,但不是合法的函数引用。因此,所有start请求都将失败。因此,实际上不是传递函数引用,而是调用函数并传递其返回值。

    • TL; DR**

你需要的是:

worker = Thread(target=sendRequest, args=(v, lines[v], proxies, proxy_type))

相关问题