【问题标题】:Having issue with asynchronous threads异步线程有问题
【发布时间】:2019-06-13 01:58:19
【问题描述】:

我有一个大程序,我正在为它使用线程。我这里有个问题,所以我的线程如下所示。

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。

有没有办法解决这个问题。

【问题讨论】:

  • 我建议你不要在 Python 中使用这样的线程,如果你正在处理 IO,你应该使用任何 asyncio 解决方案,我会选择 trio。
  • 是的,你是对的,但我只是没想到,线程会锁定一切。

标签: python python-3.x multithreading python-multithreading


【解决方案1】:

您的问题缺少有关目标函数的详细信息,但我将尝试猜测其中一些调用外部 C/C++ 模块。

在这种情况下,请查看this answer

因此,无论是 I/O 绑定模块没有释放 GIL,还是其中一个函数计算量很大并且会与您的操作系统调度程序混淆。 由于您似乎正在处理网络,我想第一个选项是正确的。

如果模块是您自己创建的,那么您有多种选择:

  • 了解如何使模块调用线程安全,并释放 GIL。
  • 使用多处理和进程间通信。
  • 使用另一个没有 GIL 的 python 实现(例如 Jython 和 IronPython)

如果模块是您在互联网上找到的下载模块:

  • 使用另一个更合适的 C 扩展名
  • 编辑它们以符合您的要求 - 并且可能会请求更改,因为 I/O 绑定模块应该释放 GIL

请注意,内置 I/O 绑定函数释放 GIL(如您所见 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多