Python脚本的多处理运行时错误

Python脚本的多处理运行时错误,python,web-scraping,multiprocessing,Python,Web Scraping,Multiprocessing,我在运行代码时遇到以下错误: ... RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child pr

我在运行代码时遇到以下错误:

...
RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
...
我正在以以下方式运行脚本:

if __name__ == '__main__':
    object_ = NameToLinkedInScraper(csv_file_name='people_small.csv', person_name_column='company', organization_name_column='email')
    object_.multiproc_job()
班级:

class NameToLinkedInScraper:
    pool = Pool()

    proxy_list = PROXY_LIST
    csv_file_name = None
    person_name_column = None
    organization_name_column = None
    find_facebook = False
    find_twitter = False

    def __init__(self, csv_file_name, person_name_column, organization_name_column, find_facebook=False,
                 find_twitter=False):
        self.csv_file_name: str
        self.person_name_column: str
        self.organization_name_column: str
        self.df = pd.read_csv(csv_file_name)

    def internal_linkedin_job(self, _df):
        _df['linkedin_profile'] = np.nan
        _df['linkedin_profile'] = _df.apply(
            lambda row: term_scraper(
                str(row[self.person_name_column]) + " " + str(row[self.organization_name_column]), self.proxy_list,
                'link', output_generic=False), axis=1)

    def internal_generic_linkedin_job(self, _df):
        _df['linkedin_generic'] = np.nan
        _df['linkedin_generic'] = _df.apply(
            lambda row: term_scraper(
                str(row[self.person_name_column]) + " " + str(row[self.organization_name_column]), self.proxy_list,
                'link', output_generic=True), axis=1)

    def internal_facebook_twitter_job(self, _df):
        _df['title'] = np.nan
        _df['title'] = _df.apply(
            lambda row: term_scraper(
                str(row[self.person_name_column]) + " " + str(row[self.organization_name_column]), self.proxy_list,
                'title'), axis=1)
        if self.find_facebook:
            _df['facebook_profile'] = np.nan
            _df['facebook_profile'] = _df.apply(
                lambda row: term_scraper(
                    str(row[self.person_name_column]) + " " + str(row[self.organization_name_column]), self.proxy_list,
                    'link', output_generic=False, social_network='facebook'), axis=1)
        if self.find_twitter:
            _df['twitter_profile'] = np.nan
            _df['twitter_profile'] = _df.apply(
                lambda row: term_scraper(
                    str(row[self.person_name_column]) + " " + str(row[self.organization_name_column]), self.proxy_list,
                    'link', output_generic=False, social_network='twitter'), axis=1)

    def multiproc_job(self):
        linkedin_profile_proc = Process(target=self.internal_linkedin_job, args=self.df)
        linkedin_generic_profile_proc = Process(target=self.internal_generic_linkedin_job, args=self.df)
        internal_facebook_twitter_job = Process(target=self.internal_facebook_twitter_job, args=self.df)
        jobs = [linkedin_profile_proc, linkedin_generic_profile_proc, internal_facebook_twitter_job]
        for j in jobs:
            j.start()

        for j in jobs:
            j.join()
        self.df.to_csv(sys.path[0] + "\\" + self.csv_file_name + "_" + ".csv")

而且我无法找出问题所在,脚本正在Windows中运行,我找不到答案。
我尝试将freeze_support()添加到main中,但没有成功,还将进程创建和作业分配从类转移到了main中。

通过创建
池作为类属性,在导入过程中定义
nametolinkedinstrape
时执行它(“main”)文件由子级导入,因此他们可以访问所有相同的类和函数)。如果允许它这样做,它将递归地继续创建更多的子对象,然后这些子对象将导入同一个文件并自己创建更多的子对象。这就是为什么在导入时禁用生成子进程的原因。相反,您应该只在
\uuuu init\uuuu
中调用
,这样只有在创建类的实例时才会创建新的子进程。通常应避免使用类属性而不是实例属性,除非它是静态数据,或者需要在类的所有实例之间共享。

通过将
池创建为类属性,在导入期间定义
nametolinkedinstrape
时执行该属性(“主”文件由子级导入,因此他们可以访问所有相同的类和函数)。如果允许它这样做,它将递归地继续创建更多的子对象,然后这些子对象将导入同一个文件并自己创建更多的子对象。这就是为什么在导入时禁用生成子进程的原因。相反,您应该只在
\uuuu init\uuuu
中调用
,这样只有在创建类的实例时才会创建新的子进程。通常应避免使用类属性而不是实例属性,除非它是静态数据,或者需要在类的所有实例之间共享。

谢谢!这就解决了!但现在面临另一个问题,对于我得到的每个进程运行:进程进程-6:回溯(最近一次调用最后一次):文件“C:\Users\User\anaconda3\envs\scraping\u env\u 3\u 8\lib\multiprocessing\process.py”,第315行,在bootstrap self.run()文件“C:\Users\User\anaconda3\envs\scraping\u env\u 3\u 8\lib\multiprocessing\processing.py”,第108行,在运行self.\u target(*self.\u args,**self.\u kwargs)类型错误:internal\u facebook\u twitter\u job()接受1个位置参数,但10个参数与此无关,但我现在看不到任何地方使用
池本身。看起来你可以摆脱它,因为你正在自己创建
Process
es。至于错误,
Process
希望
args
是一个元组,所以请尝试
args=(self.df,)
在其中创建所有进程。谢谢!这就解决了!但现在面临另一个问题,对于我得到的每个进程运行:进程进程-6:回溯(最近一次调用最后一次):文件“C:\Users\User\anaconda3\envs\scraping\u env\u 3\u 8\lib\multiprocessing\process.py”,第315行,在bootstrap self.run()文件“C:\Users\User\anaconda3\envs\scraping\u env\u 3\u 8\lib\multiprocessing\processing.py”,第108行,在运行self.\u target(*self.\u args,**self.\u kwargs)类型错误:internal\u facebook\u twitter\u job()接受1个位置参数,但10个参数与此无关,但我现在看不到任何地方使用
池本身。看起来你可以摆脱它,因为你正在自己创建
Process
es。至于错误,
Process
希望
args
是一个元组,所以请尝试
args=(self.df,)
在其中创建所有进程。