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,)
在其中创建所有进程。