【python,threading】python多线程

使用多线程的方式

1、  函数式:使用threading模块threading.Thread(e.g target name parameters)

 1 import time,threading
 2 def loop():
 3     print("thread %s is running..." % threading.current_thread().name)
 4     n = 0
 5     while n < 5:
 6         n += 1
 7         print("thread %s is running... n = %s" % (threading.current_thread().name,str(n)))
 8         time.sleep(1)
 9     print("thread %s is over..." % threading.current_thread().name)
10
11 print("thread %s is running..." % threading.current_thread().name)
12
13 ts = []
14 for i in range(5):
15     t = threading.Thread(target = loop, name = ‘loopThread ‘+ str(i))
16     t.start()
17     ts.append(t)
18 for t in ts:
19     t.join()
20 print("thread %s is over..." % threading.current_thread().name) 

多线程的输出:

thread MainThread is running...
thread loopThread 0 is running...
thread loopThread 0 is running... n = 1
thread loopThread 1 is running...
thread loopThread 1 is running... n = 1
thread loopThread 2 is running...
thread loopThread 2 is running... n = 1
thread loopThread 0 is running... n = 2
thread loopThread 1 is running... n = 2
thread loopThread 2 is running... n = 2
thread loopThread 0 is running... n = 3
thread loopThread 1 is running... n = 3
thread loopThread 2 is running... n = 3
thread loopThread 0 is running... n = 4
thread loopThread 1 is running... n = 4
thread loopThread 2 is running... n = 4
thread loopThread 0 is running... n = 5
thread loopThread 1 is running... n = 5
thread loopThread 2 is running... n = 5
thread loopThread 0 is over...
thread loopThread 1 is over...
thread loopThread 2 is over...
thread MainThread is over...

python中得thread的一些机制和C/C++不同:在C/C++中,主线程结束后,其子线程会默认被主线程kill掉。而在python中,主线程结束后,会默认等待子线程结束后,主线程才退出。

python对于thread的管理中有两个函数:join和setDaemon

join:如在一个线程B中调用threada.join(),则threada结束后,线程B才会接着threada.join()往后运行。

setDaemon:主线程A启动了子线程B,调用b.setDaemaon(True),则主线程结束时,会把子线程B也杀死。【此段内容摘录自junshao90的博客

2. 使用面向对象方式。创建子类继承自threading.Thread,需overwrite run方法

 1 import time,threading
 2 class threadTest(threading.Thread):
 3     def __init__(self,tname):
 4         threading.Thread.__init__(self)
 5         self.name = tname
 6     def run(self):
 7         print("thread %s is running..." % threading.current_thread().name)
 8         n = 0
 9         while n < 5:
10             n += 1
11             print("thread %s is running... n = %s" % (threading.current_thread().name,str(n)))
12             time.sleep(1)
13         print("thread %s is over..." % threading.current_thread().name)
14 print("thread %s is running..." % threading.current_thread().name)
15
16 for i in range(3):
17     t = threadTest(‘t‘ + str(i))
18     t.start()
19     t.join()
20 print("thread %s is over..." % threading.current_thread().name) 

运行输出:

thread MainThread is running...
thread t0 is running...
thread t0 is running... n = 1
thread t0 is running... n = 2
thread t0 is running... n = 3
thread t0 is running... n = 4
thread t0 is running... n = 5
thread t0 is over...
thread t1 is running...
thread t1 is running... n = 1
thread t1 is running... n = 2
thread t1 is running... n = 3
thread t1 is running... n = 4
thread t1 is running... n = 5
thread t1 is over...
thread t2 is running...
thread t2 is running... n = 1
thread t2 is running... n = 2
thread t2 is running... n = 3
thread t2 is running... n = 4
thread t2 is running... n = 5
thread t2 is over...
thread MainThread is over...

3. lock

多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响。

而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把  内容给改乱了。

lock 对象:

acquire():负责取得一个锁。如果没有线程正持有锁,acquire方法会立刻得到锁。否则,它闲意态等锁被释放。一旦acquire()返回,调用它的线程就持有锁。

release(): 释放锁。如果有其他线程正等待这个锁(通过acquire()),当release()被效用的时候,它们中的一个线程就会

被唤醒

以下内容摘自“廖雪峰的官方网站”

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832360548a6491f20c62d427287739fcfa5d5be1f000
balance为共享资源,多进程同时执行,一定概率结果为balance != 0[详细描述见原文]
def change_it(n):
    # 先存后取,结果应该为0:
    global balance
    balance = balance + n
    balance = balance - n

使用threading.Lock()

import threading

total = 0
lock = threading.Lock()
def change(n):
    global total
    total += n
    total -= n

def run_thread(n):
    lock.acquire()
    for i in range(100000):
        change(n)
    lock.release()

t1 = threading.Thread(target = run_thread, args=(5,))
t2 = threading.Thread(target = run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(total)

4. 其他详细关于对进程的资料可参考

解决共享资源问题的:条件变量,同步队列

Vamei的博客Python标准库08 多线程与同步 (threading包)

片片灵感的博客Python多线程学习

时间: 2024-11-09 06:10:17

【python,threading】python多线程的相关文章

【python标准库学习】thread,threading(二)多线程同步

继上一篇介绍了python的多线程和基本用法.也说到了python中多线程中的同步锁,这篇就来看看python中的多线程同步问题. 有时候很多个线程同时对一个资源进行修改,这个时候就容易发生错误,看看这个最简单的程序: import thread, time count = 0 def addCount(): global count for i in range(100000): count += 1 for i in range(10): thread.start_new_thread(ad

【python标准库学习】thread,threading(一)多线程的介绍和使用

在单个程序中我们经常用多线程来处理不同的工作,尤其是有的工作需要等,那么我们会新建一个线程去等然后执行某些操作,当做完事后线程退出被回收.当一个程序运行时,就会有一个进程被系统所创建,同时也会有一个线程运行,这个线程就是主线程main,在主线程中所创建的新的线程都是子线程,子线程通常都是做一些辅助的事.python中提供了thread和threading两个模块来支持多线程. python中使用线程有两种方式,第一种是用thread模块的start_new_thread函数,另一种是用threa

python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)

今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系,纯的python代码处理一般逻辑的确无法活动性能上的极大提升,但是在处理需要等待外部资源返回或多用户的应用程序中,多线程仍然可以作为一个比较好的工具来进行使用. python提供了两个模块thread和threading 来支持python的多线程操作.通俗的讲一般现在我们只使用threading

threading模块,python下的多线程

一.GIL全局解释器锁 In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe. (However, sin

[Python]threading local 线程局部变量小测试

概念 有个概念叫做线程局部变量,一般我们对多线程中的全局变量都会加锁处理,这种变量是共享变量,每个线程都可以读写变量,为了保持同步我们会做枷锁处理.但是有些变量初始化以后,我们只想让他们在每个线程中一直存在,相当于一个线程内的共享变量,线程之间又是隔离的.python threading模块中就提供了这么一个类,叫做local. 多线程中共享变量和局部变量的区别我画两个小图,简单描述下(作图能力一般,请见谅,概念性的东西大家可以google下,很多好文章) 全局变量 线程局部变量 对比: 下面是

Python学习笔记- Python threading模块

Python threading模块 直接调用 # !/usr/bin/env python # -*- coding:utf-8 -*- import threading import time def sayhi(num): print("running on number:%s" % num) time.sleep(3) if __name__ =='__main__': #生成两个线程实例 t1 = threading.Thread(target=sayhi,args=(1,)

(转)python多进程、多线程编程

1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令. 1.1.2 线程的工作方式 假设你正在读一本书,没有读完,你想休息一下,但是你想在回来时恢复到当时读的具体进度.有一个方法就是记下页数.行数与字数这三个数值,这

python高级之多线程

python高级之多线程 本节内容 线程与进程定义及区别 python全局解释器锁 线程的定义及使用 互斥锁 线程死锁和递归锁 条件变量同步(Condition) 同步条件(Event) 信号量 队列Queue Python中的上下文管理器(contextlib模块) 自定义线程池 1.线程与进程定义及区别 线程的定义: 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同

python threading

python threading 模块使用多线程.感谢小马哥指点迷津. #!/usr/bin/env python # -*- coding: UTF-8 -*- import threading threads = [] # 先创建线程对象  for li in db_con:     t = threading.Thread(target=update_thread,args=(list,file,db_con,li))     threads.append(t) # 启动所有线程 for 

python中的多线程【转】

转载自: http://c4fun.cn/blog/2014/05/06/python-threading/ python中关于多线程的操作可以使用thread和threading模块来实现,其中thread模块在Py3中已经改名为_thread,不再推荐使用.而threading模块是在thread之上进行了封装,也是推荐使用的多线程模块,本文主要基于threading模块进行介绍.在某些版本中thread模块可能不存在,要使用dump_threading来代替threading模块. 线程创