子线程如何不阻塞主线程

 for t in thread_list:
            # t.setDaemon(True)
            t.start()
            t.join()

这样做很方便啊,想开多少个线程就开多少个线程
但是这种情况遇到子线程阻塞的话就会有问题,例如rabbitmq的消费者,启动之后,consumer是一直处于阻塞的状态的,创建多个consumer的话,上面的例子会发生子线程阻塞主线程的情况!
解决的办法是这样的:

 for t in thread_list:
            # t.setDaemon(True)
            t.start()
 for i in range(len(thread_list)):
     thread_list[i].join()
### 回答1: 在Python 2.6中,可以使用 `thread` 模块来创建线程。当线程没有执行完毕时,线程会被阻塞。 为了避免这种情况,可以使用 `threading` 模块。该模块提供了更好的线程管理功能,包括线程同步、线程锁等。 下面是一个使用 `threading` 模块创建线程的示例代码: ```python import threading def worker(): # 线程的工作内容 print("线程开始执行...") # 执行一些任务 print("线程执行完毕!") # 创建线程 t = threading.Thread(target=worker) # 启动线程 t.start() # 线程继续执行 print("线程执行完毕!") ``` 在此示例中,线程不会被阻塞,因为线程是在另外一个线程执行的。线程会继续执行直到 `print("线程执行完毕!")`。同时,线程也在执行自己的任务,直到 `print("线程执行完毕!")`。 ### 回答2: Python 2.6中的线程阻塞线程的原因是因为在该版本的Python中,线程在进行I/O操作时会自动加锁,防止其他线程进行并发的I/O操作。这种机制被称为“全局解释器锁(Global Interpreter Lock,GIL)”。 GIL的存在是为了保证Python解释器的线程安全性,因为Python的解释器是线程不安全的。GIL的作用是在任意时刻只允许一个线程执行Python字节码,因此其他线程都会被阻塞。这样可以防止多个线程同时修改共享数据导致的数据一致性问题。 在Python 2.6中,I/O操作(如文件读写、网络通信等)会触发GIL的释放,这样其他线程就有机会继续执行。但是,在进行I/O操作时,线程会自动加锁,从而阻塞线程执行线程只能等待线程完成I/O操作后才能继续执行。 为了解决这个问题,可以考虑使用多进程代替多线程。在Python的多进程模块(multiprocessing)中,每个进程都有自己独立的解释器和GIL,因此不存在子线程阻塞线程的问题。同时,多进程可以更好地利用多核处理器的能力,提高程序的运行效率。 总结起来,Python 2.6中线程阻塞线程是由于全局解释器锁(GIL)的机制导致的,为了避免这个问题,可以考虑使用Python的多进程模块进行并发编程。 ### 回答3: Python 2.6中,线程在子线程运行时会被阻塞。这是因为Python 2.6中的多线程模块(thread)采用的是同步的机制,即线程会等待线程结束后才会继续执行。 在Python 2.6中,通过`thread.start_new_thread()`方法可以创建新的线程。当创建线程后,线程会暂停执行,并等待线程结束后再继续执行其余的操作。这会导致线程阻塞,无法同时执行其他任务。 具体而言,如果在线程中调用了`thread.start_new_thread()`方法创建了一个线程,那么线程会等待该线程完成其任务后再继续执行后续代码。这样的阻塞行为可能导致线程在子线程运行期间停止响应其他用户操作或任务。 为了解决这个问题,Python后续版本(如Python 3.x)中引入了更加高级的多线程模块(如threading模块),可以更好地管理和控制线程执行。在较新的Python版本中,我们可以使用`threading.Thread()`类来创建和管理线程,使得线程不会被阻塞,可以并发地执行多个任务。 总的来说,Python 2.6中的线程阻塞线程的原因是多线程模块采用了同步的机制,需要等待线程完成后才能继续执行。而在后续版本中,我们可以通过更高级的多线程模块来实现并发执行任务,避免线程阻塞
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值