python multiprocessing只会启动第一个进程

标签 python multiprocessing

所以我研究了这个 python 东西,我会从 reddit 下载图片并将它们再次上传到 ig,我试图使下载和上传过程同时进行。我正在使用多重处理来解决这个问题。

但是,只有我的第一个进程才会启动...

这是“完整”代码:

def main(argv):
   timer = 15
   username = ''
   password = ''
   caption = ''
   filecontainer = ''
   isset = 0
   redisset = 0
   redname = ''
   redsort = 'new'
   redtimer = 1
   redscore = 50
   redmax = 40
   redre = False


   try:
       opts, args = getopt.getopt(argv, "hr:t:u:p:c:f:", ["reddit=", "red=", "redditname=", "freshtimer=","top","new","hot", "score=", "max=","overwrite"]) 
   except getopt.GetoptError:
       print('this.py -t <time in minutes> -u <ig-username> -p <ig-password> -c <captionContainer> -f <path to filecontainer>')
       sys.exit(2)
   for opt, arg in opts:

   ## Just some getopt stuff here...


   if isset == 4: #isset is just a way of testing if every arg was set.
       mainprozess = Process(target = runUpload(timer,username,password,caption,filecontainer))
       mainprozess.start()
       mainprozess.join()


       rdprozess = Process(target = getReddit(filecontainer,redname,redtimer,redmax,redscore,redsort,redre))
       rdprozess.start()
       rdprozess.join()
   else:
       print('you need to set all args')
       print('this.py -t <time in minutes(only INTEGER!!!)> -u <ig-username> -p <ig-password> -c <caption> -f <path to filecontainer>')
       sys.exit(1)

def runUpload(timer,username,password,caption,filecontainer):
#search for images in filecontainer


   allFiles = []

   while len(allFiles) <= 1:

       allFiles = [f for f in os.listdir(filecontainer) if os.path.isfile(os.path.join(filecontainer, f))]
       time.sleep(15)
       print("no files found...\nwaiting for files")

   r = random.randint(0,100)

   if r <= 100: #80% chance to post just an image
       postOK = postImage(allFiles,filecontainer,caption,username,password)
   #elif r >= 80: #20% chance to post an album
   #    postOK = postAlbum(allFiles,filecontainer,caption,username,password)







   if postOK == True:
       #delete old
       time.sleep(random.randint(5,45))
       #deleteOld(username,password,deleteAfter=100,staticPosts=12)



       print('\nsleeping for the next '+str(timer)+'minutes...\n')

       waittime = timer*30 + (random.randint(-60,60))

       i = 0
       while i < waittime:
           time.sleep(2)
           print(str((waittime*2-i*2)//60)+' min && '+str((waittime*2-i*2)%60)+' sec')
           i += 1

       #time.sleep(timer*60)
       runUpload(timer,username,password,caption,filecontainer)

   else:
       i = 0
       while i < 10:
           time.sleep(2)
           print('.')
           i += 1

       print("an error ocurred\nretrying")
       del allFiles[allFiles.index(randomFile)]
       try:
           os.remove(os.path.join(filecontainer,randomFile))
       except Exception as e:
           pass
       runUpload(timer,username,password,caption,filecontainer)


if __name__ == "__main__":
   freeze_support()
   main(sys.argv[1:])

但是请关注这部分:

   mainprozess = Process(target = runUpload(timer,username,password,caption,filecontainer))
   mainprozess.start()
   mainprozess.join()


   rdprozess = Process(target = getReddit(filecontainer,redname,redtimer,redmax,redscore,redsort,redre))
   rdprozess.start()
   rdprozess.join()

补充:如果我改变它,它只会启动第一个

我不知道为什么以及如何解决它...... 希望您有任何建议并祝您有美好的一天。

更新: 哦糟糕,我自己修好了!

不,事实证明我只是愚蠢......

显然我总是调用函数而不是在进程中放置目标,因为参数需要位于额外的参数中。

修复方法如下:

    mainprozess = Process(target = runUpload,args=[timer,username,password,caption,filecontainer])
    rdprozess = Process(target = getReddit,args=[filecontainer,redname,redtimer,redmax,redscore,redsort,redre])

    mainprozess.start()
    rdprozess.start()
    mainprozess.join()
    rdprozess.join()

哈哈,这就是两年学习编程给你带来的成果😂...

对不起

最佳答案

将第一个 join() 移至代码底部。 join() 意思是“等待完成”。因此,第一个过程在开始第二个过程之前结束。

相反,做类似的事情

mainprozess.start()
rdprozess.start()
mainprozess.join()
rdprozess.join()

关于python multiprocessing只会启动第一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52115775/

相关文章:

c++ - 我们如何在使用链表时使用多线程

CLONE_VM 标志使 itimer 不准确?

python - 检测未包含在双引号内的符号(正则表达式)

python - 向 Python 函数添加属性的最佳方法

python - 如何在 python matplotlib 中设置限制范围 (xlim)?

python - cx_freeze 错误 "cx_Freeze.freezer.ConfigError: no base named Console"

python 多处理队列 get([block[, timeout]]),阻塞队列中的项目 还是阻塞队列?

ruby - 作为脚本调用时 trap 不工作;但适用于 IRB

python - Python 会在线程模式下使用所有处理器吗?

python - 实时轨迹绘图 - Matplotlib