我有一个大程序,并且正在使用线程。我在这里遇到问题,所以我的线程如下图所示。
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。
此问题是否有解决方法?
答案 0 :(得分:3)
您的问题缺少有关目标函数的详细信息,但我将尝试猜测其中一些函数调用了外部C / C ++模块。
在这种情况下,请查看this answer
因此,是I / O绑定模块没有释放GIL,还是其中一个功能在计算上很繁琐,并且与您的OS调度程序混在一起。 由于您似乎正在与网络打交道,所以我猜第一个选择是正确的选择。
如果模块是您自己创建的,那么您有多个选择:
如果模块是已下载的模块,则可以在Internet上找到
请注意,内置的I / O绑定函数要做会释放GIL(如您所见,here)