为了账号安全,请及时绑定邮箱和手机立即绑定

请教各位一个问题,求解答:if name == "main" 函数里的多进程不执行

请教各位一个问题,求解答:if name == "main" 函数里的多进程不执行

手掌心 2019-07-28 12:05:41
背景:一个进程池处理下载图片,但是下载图片的这个函数被略过了代码如下importosimportrequestsfrommultiprocessingimportPoolimgss=['//img30.360buyimg.com/n1/s1280x960_jfs/t22603/212/2599271310/150344/e03347b3/5b87d725Na3a0fca9.jpg','//img30.360buyimg.com/n1/s1280x960_jfs/t23803/270/2660558588/150459/2048f327/5b87d730Na2cb6120.jpg','//img30.360buyimg.com/n1/s1280x960_jfs/t1/20773/31/6300/133150/5c4d1819Ee0c22d12/54cf06a8191e749a.jpg','//img30.360buyimg.com/n1/s1280x960_jfs/t1/52295/33/1509/216396/5cf3d0c0Ef51c7006/df16ec85a1e0e301.jpg']defimgDown(img):'''downloadimageandsavetofolder'''url='http:'+imgimgName=img.split('/')[-1]r=requests.get(url,headers=headers)withopen(os.getcwd()+r'\{}\{}'.format(title,imgName),'ab+')asf:f.write(r.content)print('1picturedone!')defcheckDown(imgList):#checkD=input("是否需要下载产品图片?需要回复'y'or'Y':")checkD='y'ifcheckD=='y'orcheckD=='Y':os.mkdir(title)p=Pool(4)foriinimgList:p.apply_async(imgDown,args=(i,))p.close()p.join()else:passif__name__=='__main__':title='producttest'headers={'accept-encoding':'deflate,br','user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/71.0.3578.98Safari/537.36'}checkDown(imgss)一直在找问题,后面就直接结束了,有创建一个文件夹,但是里面图片一个都没有下到,我改了很多地方,后面发现把参数header以及参数title放到if__name__=="__main__":的上面就可以了,但是我不懂,这个不是用来自己运行脚本和导入到其他脚本中的区别么,和上面这个是什么原因?上面是脚本的一部分,其中的title是需要另外一个函数返回的,所以没办法放在上面去,有其他办法么?或者告诉我原因,谢谢!
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

没看清题主问题,发了错误回答,抱歉
你放到if__name__=='__main__':里面,它们就成了该if语句块的局部变量了,放外面才是整个文件可访问的变量
                            
查看完整回答
反对 回复 2019-07-28
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

问题在于,multiprocessing模块启动的子进程中本模块名不是__main__而是__mp_main__,因此if__name__=='__main__'在这些进程中不成立,这些进程的上下文中也就不会有title和headers变量了。你可以具体描述一下你需要的title和headers是怎么来的,我们再来看怎么解决。
                            
查看完整回答
反对 回复 2019-07-28
  • 2 回答
  • 0 关注
  • 916 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信