您的代码有多个问题.首先,由于全局解释器锁(GIL),CPython中的线程不会“同时”运行Python代码.线程必须持有GIL才能执行Python字节码.默认情况下,如果线程没有阻止它,因为它确实阻塞了I / O,所以它在GIL中最多保留5毫秒(Python 3.2).为了并行执行Python代码,您将必须使用多重处理.

您也可以不必要地使用Manager.Queue而不是queue.Queue. Manager.Queue是在单独的管理器进程上的queue.Queue.您在此处引入了绕过IPC和内存复制的弯路,但没有任何好处.

造成僵局的原因是您在这里有竞争状况:

if not workQueue.empty():

data = q.get()

这不是原子操作.线程可以检查workQueue.empty(),然后删除GIL,让另一个线程耗尽队列,然后继续执行data = q.get(),如果您不将某些内容再次放入队列,它将永远阻塞. Queue.empty()检查是一种常规的反模式,不需要使用它.使用有毒药丸(前哨值)来代替获取循环并让工人知道他们应该退出.您需要与工作人员一样多的哨兵值.查找有关iter(callabel,sentinel)here的更多信息.

import time

from queue import Queue

from datetime import datetime

from threading import Thread,current_thread

SENTINEL = 'SENTINEL'

class myThread(Thread):

def __init__(self,func,inqueue):

super().__init__()

self.func = func

self._inqueue = inqueue

def run(self):

print(f"{datetime.now()} {current_thread().name} starting")

self.func(self._inqueue)

print(f"{datetime.now()} {current_thread().name} exiting")

def process_data(_inqueue):

for data in iter(_inqueue.get,SENTINEL):

print(f"{datetime.now()} {current_thread().name} "

f"processing {data}")

time.sleep(1)

if __name__ == '__main__':

N_WORKERS = 3

inqueue = Queue()

input_data = ["One","Five"]

sentinels = [SENTINEL] * N_WORKERS # one sentinel value per worker

# enqueue input and sentinels

for word in input_data + sentinels:

inqueue.put(word)

threads = [myThread(process_data,inqueue) for _ in range(N_WORKERS)]

for t in threads:

t.start()

for t in threads:

t.join()

print(f"{datetime.now()} {current_thread().name} exiting")

示例输出:

2019-02-14 17:58:18.265208 Thread-1 starting

2019-02-14 17:58:18.265277 Thread-1 processing One

2019-02-14 17:58:18.265472 Thread-2 starting

2019-02-14 17:58:18.265542 Thread-2 processing Two

2019-02-14 17:58:18.265691 Thread-3 starting

2019-02-14 17:58:18.265793 Thread-3 processing Three

2019-02-14 17:58:19.266417 Thread-1 processing Four

2019-02-14 17:58:19.266632 Thread-2 processing Five

2019-02-14 17:58:19.266767 Thread-3 exiting

2019-02-14 17:58:20.267588 Thread-1 exiting

2019-02-14 17:58:20.267861 Thread-2 exiting

2019-02-14 17:58:20.267994 MainThread exiting

Process finished with exit code 0

如果您不坚持子类化Thread,也可以只使用multiprocessing.pool.ThreadPool也就是multiprocessing.dummy.Pool,它在后台为您做管道.

python多个线程join_python-使用`thread.join()`时多线程冻结相关推荐

  1. python 线程类 threading.Thread.join() 方法 (自闭,不让别人进来了)

    def join(self, timeout=None):"""Wait until the thread terminates. 等待线程终止.This blocks ...

  2. Python 批量创建线程及threading.Thread类的常用函数及方法

    在<[Python]线程的创建.执行.互斥.同步.销毁>(点击打开链接)中介绍了Python中线程的使用,但是里面线程的创建,使用了很原始的方式,一行代码创建一条.其实,Python里是可 ...

  3. python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)

    前言 今天小王请xiaoming和xiaowang吃火锅,吃完火锅的时候会有以下三种场景: 场景一:小王(主)先吃完了,海海(客)和老王(客)还没吃完,这种场景会导致结账的人先走了,剩下两个小伙伴傻眼 ...

  4. Thread.join的作用和原理

    转自:https://www.jianshu.com/p/fc51be7e5bc0 原文解释的有点歧义,注意看原文评论.本文在原文基础上修改部分语句. 文章简介 很多人对Thread.join的作用以 ...

  5. python 守护线程 join_Python多线程threading join和守护线程setDeamon原理详解

    同一进程下的多个线程共享内存数据,多个线程之间没有主次关系,相互之间可以操作:cpu执行的都是线程,默认程序会开一个主线程:进程是程序以及和程序相关资源的集合:某些场景下我们可以使用多线程来达到提高程 ...

  6. python thread join_Python Thread join用法详解

    Thread 提供了让一个线程等待另一个线程完成的 join() 方法.当在某个程序执行流中调用其他线程的 join() 方法时,调用线程将被阻塞,直到被 join() 方法加入的 join 线程执行 ...

  7. python3 线程 join_python 多线程 join start

    python 多线程 join start 线程的几个状态初始(NEW):新创建了一个线程对象,但还没有调用START()方法. 运行(RUNNABLE):线程中将就绪(READY)和运行(RUNNI ...

  8. Python基础之线程(Thread)

    进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行 ...

  9. Python入门之——线程threading(Thread类)简介

    几乎所有的操作系统都支持同时运行多个任务,每个任务通常是一个程序,每一个运行中的程序就是一个进程,即进程是应用程序的执行实例.现代的操作系统几乎都支持多进程并发执行.注意,并发和并行是两个概念,并行指 ...

最新文章

  1. vmware虚拟机redhat7.2下docker容器安装hadoop
  2. 僵尸网络中区块链的利用方法分析
  3. java常用的几种线程池
  4. 简单爬虫-爬取免费代理ip
  5. spark广播变量的使用(转)
  6. 【PPT分享】阿里巴巴定向广告之新一代Rank技术.pdf(附下载链接)
  7. 热带鱼水族箱屏幕保护程序
  8. eclipse使用配置教程
  9. Spring Security源码解析(一)
  10. 给大家分享学好 Python 的 11 个优秀资源
  11. 软件设计师提纲+复习资料整理(上午题)
  12. Keil出现Error:Flash Download failed - Could not load file
  13. java连接mongo数据库,并执行db.runCommand命令
  14. 香港、澳门通行证网上申请
  15. 论文的开题报告是什么样的?
  16. 酷狗音乐下载|酷狗音乐播放器下载
  17. Linux中命令行查找文件
  18. 【ML】LambdaMART算法原理--应用场景
  19. 访问控制的三种模型(DAC、MAC、RBAC)
  20. 北京信息科技大学第十一届程序设计竞赛(重现赛)J andy的树被砍了

热门文章

  1. comparator
  2. 软件测试女孩学适合吗
  3. servlet之控制分发
  4. K-Median Subsequence
  5. Doctype? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?
  6. 人一生要解决的50个关键问题
  7. Win2008上.NET4.0部署出错HTTP 错误 500.21 - Internal Server Error的解决方法
  8. winscp连接虚拟机Linux被拒绝的问题解决方案
  9. IntelliJ IDEA导入JDK出现The selected directory is not a valid home for JDK问题的解决方法
  10. Python setup.py开发与安装