难以实现多线程解决方案同时多次运行类方法?

问题描述 投票:0回答:1

我无法通过线程同时多次运行此test()类方法。代码运行时,线程按顺序运行而不是同时运行,我无法弄清楚原因。我正在使用的线程逻辑是这样的:

testing = Generator()
threads = []
for x in range(0,10):
    t = Thread(target=testing.test())
    threads.append(t)
    t.start()
for t in threads:
    t.join()

我怀疑它可能是我的初学者,但我不确定。如果有人能帮助我找到一个真正的解决方案,以便我可以多次同时运行该方法,我将非常感激。我的代码如下。

import requests
import re
from bs4 import BeautifulSoup as soup
import random
from threading import Thread
from multiprocessing import Process

itemlink = str(input("Please enter an item link: "))


def random_line(fname):
    lines = open(fname).read().splitlines()
    print('fuck you')
    return random.choice(lines)



class Generator(Thread):
    def __init__(self, itemlink):
        Thread.__init__(self)
        self.session = requests.Session()
        #self.proxy = random_line("proxies.txt")
        self.proxy = ''
        self.firstname = ''
        self.lastname = ''
        self.email = ''
        self.password = ''
        self.itemlink = itemlink
        self.partial_item_link = itemlink[20::]

    def test(self):
        self.proxy = random_line('proxies.txt')
        self.firstname = random.choice(["Jackson", "Aiden", "Sophia", "Emma", "Olivia", "Lucas", "Ava", "Liam", "Mia", "Noah", "Ethan", "Isabella", "Riley", "Caden", "Aria", "Mason", "Elijah", "Zoe", "Lily", "Michael", "Benjamin", "Emily", "James", "Chloe", "Abigail", "Avery", "Evelyn", "Daniel", "Jack", "Madison", "Caleb", "Alexander", "Daniel", "Jack", "Evelyn", "Isaac", "Cameron", "Julian", "Eli", "Peyton", "Mackenzie", "Maria", "Camilla", "John", "Lincoln", "Brayden", "Victoria"])
        self.lastname  = random.choice(["Smith", "Johnson", "Williams", "Jones", "Brown", "Davis", "Miller", "Wilson", "Moore", "Taylor", "Anderson", "Thomas", "Jackson", "White", "Harris", "Martin", "Thompson", "Garcia", "Martinez", "Lewis", "Hall", "Allen", "Young", "Hernandez", "King", "Wright", "Lopez", "Hill", "Scott", "Green", "Adams", "Baker", "Gonzales", "Nelson", "Carter", "Mitchell", "Perez", "Roberts", "Turner", "Phillips", "Campbell", "Parker", "Evans", "Stewart", "Sanchez", "Morris"])
        self.email = self.firstname + self.lastname + str(random.randint(00000,10000)) + '@gmail.com'
        self.password = 'k0rnsyrupWatchBot'
        #item_link = input("Please enter an item link")
        #print(self.proxy)
        # print(self.firstname)
        # print(self.lastname)
        #print('generating ebay account with ' + self.email)
        #print(self.password)

        self.proxy = {
            "http": self.proxy,
            "https": self.proxy
        }

        print('starting thread with {}'.format(self.email))

        #print(self.proxy)

        headers = {
            #headers that i'm passing
        }

        data = {

            #data that i'm passing
        }
        try:
            self.session.post('url', headers=headers, data=data, proxies=self.proxy)
            print('blah account with {} generated'.format(self.email))
        except:
            return


        # print(r.text)

        headers3 = {
            #more headers

        }


        s = self.session.get(self.itemlink, headers=headers3, proxies=self.proxy)
        page_soup = soup(s.text, 'html.parser')
        # print(page_soup)

        watch_link = page_soup.find('a', {'class': ' '})
        # print(watch_link)
        watch_link = watch_link['href']
        # print(watch_link)


        t = self.session.get(watch_link, headers=headers3, proxies=self.proxy)
        # s = sess.get(item_link, headers=headers3, proxies=proxy)
        # print(s.content)

        # print(t.text)
        if "ADDEDTO_ONE_LIST_MULTIPLE_OTHER" in t.text:
            print('item added to watch list')
        else:
            print('item not added to watch list')
            return

        return

    def view_bot(self):
        headers3 = {
            #more headers

        }

        self.session.get(self.itemlink, headers=headers3, proxies=self.proxy)


testing = Generator(itemlink)
threads = []
 for x in range(0,10):
     t = Thread(target=testing.test())
     threads.append(t)
     t.start()
 for t in threads:
     t.join()
python multithreading python-requests
1个回答
0
投票

这条线

t = Thread(target=testing.test())

正在呼唤testing.test!这导致每个方法调用在您的任何线程开始之前在您的设置循环中按顺序运行。相反,你想要将函数对象本身而不是它的结果传递给线程。

用以下代替上面的行

t = Thread(target=testing.test)

此外,您通常不会将函数传递给手动创建的线程并从Thread继承。选择其中一个,在你的情况下,最简单的方法就是不要继承Thread

© www.soinside.com 2019 - 2024. All rights reserved.