многопроцессорность Python только запустит первый процесс

1

Поэтому я работал над этой задачей 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()

Ха, это то, что два года обучения программирования вам...

Мне жаль

  • 1
    Вы можете опубликовать свой полный код? Нет ничего, что можно отлаживать здесь.
  • 0
    @DiegoContreras вот ты иди :)
Теги:
multiprocessing

2 ответа

0
Лучший ответ

О, дерьмо, я исправил это сам!

Нет, оказывается, я просто глуп...

По-видимому, я всегда вызывал функцию вместо того, чтобы помещать цель в процесс, потому что аргументы должны быть в дополнительном аргументе.

Здесь исправление:

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()

Ха, это то, что два года обучения программирования вам...

Мне жаль

1

Перенесите первое join() в нижнюю часть кода. join() означает "дождаться завершения". Итак, первый процесс заканчивается, прежде чем вы начнете второй.

Вместо этого сделайте что-нибудь вроде

mainprozess.start()
rdprozess.start()
mainprozess.join()
rdprozess.join()
  • 0
    Я сомневаюсь, что это решит проблему, в лучшем случае это просто заставит программу работать "параллельно".
  • 0
    Извините, но он все еще только начинает первый

Ещё вопросы

Сообщество Overcoder
Наверх
Меню