1,python里怎么创建线程threadingthreading.Thread
2 , python中如何创建并开启一个线程使用线程池:threadpool 模块 。这是一个第三方模块,可以通过下面方法安装:easy_install threadpoola=[]a.add("1")a.add("hi")print a##结果: ["1","hi"]
3,python中什么是线程线程是系统中的名词,Python一般是单线程的,Python的多线程优化很差 。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元 。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成 。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位 , 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源 。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行 。由于线程之间的相互制约,致使线程在运行中呈现出间断性 。线程也有就绪、阻塞和运行三种基本状态 。就绪状态是指线程具备运行的所有条件 , 逻辑上可以运行 , 在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量) , 逻辑上不可执行 。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身 。线程是程序中一个单一的顺序控制流程 。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位 。在单个程序中同时运行多个线程完成不同的工作,称为多线程 。【Python 线程,python里怎么创建线程】
4,请教关于python线程的两个问题是这样的 , 去掉GIL没有太大的价值,而且在新版本的python(包括python3k)也是不会取消的 。在1999年Greg Stein和Mark Hammond创建了一个去掉GIL的1.5分支,将GIL替换为细粒度锁 。但是,做过了基准测试之后,结果令人失望 , 在最好的情况下,单线程的效率只有原来的一半 。另外去掉 GIL 将会造成对解释器的大量的重写 , 它会使扩展模块变得复杂,一旦扩展有任何的全局可变数据,将不得不为多线程并发调用做好准备 。也可能需要对Python/C API进行改动,它们是为了在一系列的调用中需要对某种对象加锁所需要的 。出于以上考虑,Guido尽管欢迎有人来维护一个无GIL的python分支,但他本人不会花太多精力 。最后,尽管不会取消GIL, 但是着并不意味着不能充分利用多cpu , 有一下几种方法:1.可以创建多个进程而不是线程,进程数和cpu一样多 。2.使用Jython 或 IronPython,可以得到真正的多线程 。这个问题 也许不是很好说,但是可以这么说python是建立在虚拟机也就是pythonxx.dll上运行的,所以在这个进程里面所有的线程都是基于轮询方式来调度线程的,当然你也可以开多个实例,所以python的线程并不不是内核级的多线程 , 也不是os级的 而是基于虚拟机之上的,当然Python多线程这块 , 我也一直期望他改进,不过作为动态语言,现在这样架构够用 。第二你说的不能更好的利用cpu资源,这个不用担心,python如果多线程,还是可以充分利用的,我们这边有上万行的Python程序跑起来空运行占几MB内存cpu也不高,如果任务来了,可以占到1-2G的内存 和大量的CPU所以你不必担心不会充分利用cpu的问题,这个应该跟你的程序结构和算法,以及任务调度的关系的!5,python多线程几种方法实现Python进阶(二十六)-多线程实现同步的四种方式临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区 。锁机制threading的Lock类 , 用该类的acquire函数进行加锁,用realease函数进行解锁import threadingimport timeclass Num:def __init__(self):self.num = 0self.lock = threading.Lock()def add(self):self.lock.acquire()#加锁,锁住相应的资源self.num += 1num = self.numself.lock.release()#解锁,离开该资源return numn = Num()class jdThread(threading.Thread):def __init__(self,item):threading.Thread.__init__(self)self.item = itemdef run(self):time.sleep(2)value = http://www.lisdn.com/gkrj/shzs/n.add()#将num加1 , 并输出原来的数据和+1之后的数据print(self.item,value)for item in range(5):t = jdThread(item)t.start()t.join()#使线程一个一个执行12345678910111213141516171819202122232425262728当一个线程调用锁的acquire()方法获得锁时 , 锁就进入“locked”状态 。每次只有一个线程可以获得锁 。如果此时另一个线程试图获得这个锁 , 该线程就会变为“blocked”状态,称为“同步阻塞”(参见多线程的基本概念) 。直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态 。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态 。信号量信号量也提供acquire方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,知道有线程调用了release方法将内部计数器更新到大于1位置 。import threadingimport timeclass Num:def __init__(self):self.num = 0self.sem = threading.Semaphore(value = 3)#允许最多三个线程同时访问资源def add(self):self.sem.acquire()#内部计数器减1self.num += 1num = self.numself.sem.release()#内部计数器加1return numn = Num()class jdThread(threading.Thread):def __init__(self,item):threading.Thread.__init__(self)self.item = itemdef run(self):time.sleep(2)value = n.add()print(self.item,value)for item in range(100):python 的gil规定每个时刻只能有一个线程访问python虚拟机,所以你要用python的多线程来做计算是很不合算的,但是对于io密集型的应用,例如网络交互来说,python的多线程还是非常给力的 。如果你是一个计算密集型的任务,非要用python来并行执行.
推荐阅读
- 描述文件下载后无法安装,下载完的文件安装失败是怎样回事
- 安卓平板运行内存多大合适,平板电脑运行内存4g和2G哪种比较好
- 如何在电脑上选择适合自己的雀魂服务器? 雀魂怎么选服务器啊电脑
- mysql千万级数据导出 mysql如何导入千万级数据
- 编程可以在手机上操作吗 手机app编程能不能用mysql
- python做统计报表 mysqlpython统计报表
- mysql在某个字段后添加字段 mysql怎么在中间插字段
- mysql脚本运行 mysql5.7脚本
- mysql指定字符集 mysql定位字符位置