Проблемы с асинхронными потоками - PullRequest
0 голосов
/ 13 июня 2019

У меня большая программа, и я использую многопоточность для нее. У меня проблема здесь, поэтому мои темы выглядят так, как показано ниже.

t1 = threading.Thread(target=broadcast, name="Send_Broadcast", args=(bd_of_the_machine, 5678))
t2 = threading.Thread(target=bd_recv_controller, name="Receive_Broadcast", args=(bd_of_the_machine, 5432))
t1.start()
t2.start()
t6 = threading.Thread(target=createKeySpace)
t6.start()
t3=threading.Thread(target=reply_for_req,name="Send_Rep",args=(ip_of_the_machine,5367))



q = Queue()
t4 = threading.Thread(target=bd_recv_wireless, args=(bd_of_the_machine,5694,q))
t4.start()
Host = (q.get())
q2=Queue()
t5 = threading.Thread(target=subscriber_wireless, name="Receive_publisher_msgs", args=(Host, 6782,q2))
t5.start()
recv_string=(q2.get())
t7 = threading.Thread(target=insert_wireless, name="insert", args=(recv_string,))
t7.start()



q3 = Queue()
t8=threading.Thread(target=bd_recv_wired, args=(bd_of_the_machine,3727,q3))
t8.start()
Host1 = (q3.get())
q4=Queue()
t9=threading.Thread(target=subscriber_wired, name="Receive_publisher_msgs", args=(Host1, 6564,q4))
t9.start()
recv_string1=(q4.get())
t10=threading.Thread(target=insert_wired,name="insert_wired",args=(recv_string1,))
t10.start()

Я не присоединяюсь ни к одному потоку, а просто запускается один за другим. Например, поток t5 должен работать асинхронно и t9 тоже. Но так как я начинаю t5 в начале только после того, как я закончил свою работу с t5, он не будет работать t9.

Есть ли какое-либо решение этой проблемы.

1 Ответ

3 голосов
/ 15 июня 2019

В вашем вопросе отсутствуют сведения о целевых функциях, но я собираюсь попытаться догадаться, что некоторые из них вызывают внешние модули C / C ++.

В этом случае посмотрите на этот ответ

Итак, независимо от того, не связан ли модуль ввода-вывода с GIL-кодом или одна из функций сложна в вычислительном отношении и мешает вашему планировщику ОС.Поскольку вы, похоже, имеете дело с сетью, я думаю, что первый вариант - правильный.

Если модули созданы вами, у вас есть несколько вариантов:

  • Понимать, как сделать вызовы модуля поточно-ориентированными, и освободить GIL.
  • Использовать многопроцессорную и межпроцессную связь.
  • Использовать другую реализацию на Python, не имеющую GIL (например, Jython и IronPython)

Если модули загружены, вы нашли найденные вами модули.в Интернете:

  • Используйте другое, более подходящее расширение C
  • Отредактируйте их в соответствии с вашими требованиями - и, возможно, запросите изменения, поскольку связанные с вводом / выводом модули должны освободить GIL

Обратите внимание, что встроенные функции ввода-вывода do освобождают GIL (как вы можете видеть здесь )

...