Qwentor
@Qwentor
Веб-программист

Как сделать, чтобы процесс в multiprocessing не завершался автоматически?

Такой код:
def outgoing():
	BASEDIR = os.path.dirname(os.path.realpath(__file__))

	pool = PooledDB(creator=pymysql,
	 
	               host='127.0.0.1',

	               user='root',

	               password='password',

	               database='tgadmin_test',

	               autocommit=True,

	               charset='utf8mb4',

	               cursorclass=pymysql.cursors.DictCursor,

	               blocking=False,

	               maxconnections=20)


	db = pool.connection()
	cursor = db.cursor()

	sql = "SELECT * FROM tgmanager_applicationusers WHERE banned_at IS NULL ORDER BY RAND() LIMIT 1"
	cursor.execute(sql)

	user1 = cursor.fetchone()
	proxy_lst = user1['proxy'].split(':')


	# VoIPServerConfig.set_bitrate_config(80000, 100000, 60000, 5000, 5000)
	client = Client(session_name=user1['phone'], api_id=user1['api_id'], api_hash=user1['api_hash'], ipv6=False, proxy=dict(hostname=str(proxy_lst[0]), port=int(proxy_lst[1]), username=str(proxy_lst[2]), password=str(proxy_lst[3])), app_version="0.22.0.1205-arm64-v8a", device_model=user1['device'], system_version=user1['os'], workdir="/home/qwentor/share/autoreg/sessions")
	client.start()


	service = VoIPNativeIOService(client, receive_calls=False)
	start_call = service.start_call('@messengerN1')
	mp3 = os.listdir(os.path.join(BASEDIR, 'speech'))
	item = random.choice(mp3)
	print('MP3##############################', item)
	speech = int(item.split('/')[-1].split(".")[0])
	print('SPEECH', speech)
	sql = """SELECT speech FROM tgmanager_dialogues WHERE id = {id}""".format(id=speech)
	cursor.execute(sql)
	res = cursor.fetchone()['speech']
	print(res)

	stream = ffmpeg.input(os.path.join(BASEDIR, 'speech', item))
	print("S1")
	stream = ffmpeg.output(stream, os.path.join(BASEDIR, 'PCM', item.split('.')[0]+'.raw'), f='s16le', ac=1, ar=48000, acodec='pcm_s16le')
	ffmpeg.run(stream)
	print("S2")
	sleep(5)
	print("S3")
	start_call.play(os.path.join(BASEDIR, 'PCM', item.split('.')[0]+'.raw'))
	print("S4")
	start_call.set_output_file(os.path.join(BASEDIR, 'outgoing.raw'))
	print("S5")


Если его запустить как
outgoing()
то все номально, а если как
proc2 = multiprocessing.Process(target=outgoing, name='outgoing')
proc2.start()

то программа завершается по достижению выполнения print("S5"), хотя там должен идти звонок через tgvoip, т.е. она должна ждать снятия трубки и проболтать текст, а не ждет
В чем дело и можно ли сделать, чтобы программа не завершалась пока не нужно
  • Вопрос задан
  • 287 просмотров
Пригласить эксперта
Ответы на вопрос 2
tumbler
@tumbler Куратор тега Python
бекенд-разработчик на python
Скорее всего какие-то из вызовов внутри outgoing() создают новые потоки, соответственно, пока они не завершатся, интерпретатор питона не останавливается, несмотря на то, что основной поток закончил свою работу.
Как именно это интерферирует с multiprocessing - это вопрос глубокой отладки, но я бы сначала попробовал сделать так, чтобы выход из outgoing() завершал процесс питона без мультипроцессинга.
Ответ написан
kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn
proc2.join()
На этом моменте скрипт будет висеть, пока не завершится процесс proc2
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
25 нояб. 2024, в 18:39
30000 руб./за проект
25 нояб. 2024, в 18:35
30000 руб./за проект
25 нояб. 2024, в 18:33
10000 руб./за проект