1、多线程类的继承

import threading
import time
class MyThreading(threading.Thread):
def __init__(self,n):
super(MyThreading,self).__init__()
self.n = n
def run(self):
print("threading %s"%(self.n))
time.sleep(2) threading1 = MyThreading("%s" %(1))
threading2 = MyThreading("%s" %(2))
threading1.start()
threading1.join() ## 1执行完才会执行2
threading2.start() E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/test4.py
threading 1
threading 2
。。。。。。。

2、线程测试案例

import threading
import time
class MyThreading(threading.Thread):
def __init__(self,n):
super(MyThreading,self).__init__()
self.n = n
def run(self):
time.sleep(2)
print("threading %s"%(self.n)) threading1 = MyThreading("%s" %(1))
threading2 = MyThreading("%s" %(2))
threading1.start()
threading1.join() ## 1执行完才会执行2
threading2.start() print("main") E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/test4.py
threading 1
main
threading 2

3、多线程时间测试案例

import threading
import time
list = [ ]
def run(i):
print("test %s"%(i))
time.sleep(2) starttime = time.time()
for i in range(1,50):
t1 = threading.Thread(target=run,args=(i,))
t1.start()
list.append(t1) for i in list :
i.join() print("end") endtime = time.time()
print("cost:", endtime-starttime) E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/test3.py
test 1
test 2
test 3
test 4
test 5
test 6
test 7
test 8
test 9
test 10
test 11
test 12
test 13
test 14
test 15
test 16
test 17
test 18
test 19
test 20
test 21
test 22
test 23
test 24
test 25
test 26
test 27
test 28
test 29
test 30
test 31
test 32
test 33
test 34
test 35
test 36
test 37
test 38
test 39
test 40
test 41
test 42
test 43
test 44
test 45
test 46
test 47
test 48
test 49
end
cost: 2.007871150970459 Process finished with exit code 0

 4、守护线程概念,默认情况下为非守护线程,即主线程推出前,需要等待所有的非守护线程结束放可以推出。而守护线程就表示这个线程“不重要”,即主线程结束时候,无需等待守护线程是否执行完成。

import threading
import time
list = [ ]
def run(i):
print("test %s"%(i))
time.sleep(5)
print("setDaemon end ") starttime = time.time()
for i in range(1,50):
t1 = threading.Thread(target=run,args=(i,))
# t1.setDaemon(True)
t1.start()
list.append(t1) print("main end")
E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/test3.py
test 1
test 2
test 3
test 4
test 5
test 6
test 7
test 8
test 9
test 10
test 11
test 12
test 13
test 14
test 15
test 16
test 17
test 18
test 19
test 20
test 21
test 22
test 23
test 24
test 25
test 26
test 27
test 28
test 29
test 30
test 31
test 32
test 33
test 34
test 35
test 36
test 37
test 38
test 39
test 40
test 41
test 42
test 43
test 44
test 45
test 46
test 47
test 48
test 49
main end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end
setDaemon end Process finished with exit code 0 import threading
import time
list = [ ]
def run(i):
print("test %s"%(i))
time.sleep(5)
print("setDaemon end ") starttime = time.time()
for i in range(1,50):
t1 = threading.Thread(target=run,args=(i,))
t1.setDaemon(True)
t1.start()
list.append(t1) print("main end") E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/test3.py
test 1
test 2
test 3
test 4
test 5
test 6
test 7
test 8
test 9
test 10
test 11
test 12
test 13
test 14
test 15
test 16
test 17
test 18
test 19
test 20
test 21
test 22
test 23
test 24
test 25
test 26
test 27
test 28
test 29
test 30
test 31
test 32
test 33
test 34
test 35
test 36
test 37
test 38
test 39
test 40
test 41
test 42
test 43
test 44
test 45
test 46
test 47
test 48
test 49
main end Process finished with exit code 0

5、GIL 和线程锁。GIL就是一把全局排他锁。他的作用就是保证同一时刻只有一个线程可以执行代码,对多线程有较大影响。

import threading
import time
lock = threading.Lock()
list = [ ] res = 0
def run(i):
# 在Python3.5中已经优化,结果都是50.在python2.7如果不加锁可能有一场
lock.acquire()
global res
res = res + 1
lock.release() starttime = time.time()
for i in range(0,50):
t1 = threading.Thread(target=run,args=(i,))
t1.setDaemon(True)
t1.start()
list.append(t1) for i in list:
i.join() print(res)

6、当有多重锁时候,可以使用Rlock,使用递归锁可以避免出现死锁的情况

7、信号量简单实用。信号量就相当于多把锁

# Author : xiajinqi
import threading
import time semaphore = threading.BoundedSemaphore() def run(i):
semaphore.acquire()
print("阮娇。。。。")
time.sleep()
semaphore.release() for i in range(,):
tt = threading.Thread(target=run,args=(i,))
tt.start()

8、event 在线程间简单应用,车子等红灯

# Author : xiajinqi
import threading
import time event = threading.Event() # - 绿灯 -20红灯,大于二十从0开始
def lighter():
count =
while True : if count >= and count < :
event.clear()
print("当前红灯")
count = count +
elif count >= :
count =
else :
event.set()
print("当前绿灯")
count +=
time.sleep()
def run():
while True :
time.sleep()
if event.is_set() : #event.waite( 如果没有值,就会一直卡主等待
print("开始过十字路口")
else :
print("开始等车")
event.wait() t1 = threading.Thread(target=lighter)
t2 = threading.Thread(target=run) t1.start()
t2.start()

9、队列queue和列表、元组的区别。二者都有顺序。但是从列表取一个数据,数据还存在。而队列取出一个数据以后,改数据在队列就会被清空。符合实际应用场景。队列有三种:一、先进先去 二、先进后去 三、可以设置优先级别的队

import queue

# 先进先去
qu= queue.Queue()
for i in range(1,5):
qu.put(i) while qu.qsize() >0:
print(qu.get()) # 先进后去
import queue # 先进先去
qu= queue.LifoQueue()
for i in range(1,5):
qu.put(i) while qu.qsize() >0:
print(qu.get()) E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/333.py
4
3
2
1 import queue # 具有优先级别的队列 .类型需要一样
qq= queue.PriorityQueue() list =[(1,"xiajinqi"),(1,"test"),(2,"test2"),(3,"test3"),(5,"test5"),(3,"test3")] for lt in list:
qq.put(lt) while qq.qsize() >0:
print(qq.get()) import queue # 具有优先级别的队列 .类型需要一样
qq= queue.PriorityQueue() list =[(1,"xiajinqi"),(1,"test"),(2,"test2"),(3,"test3"),(5,"test5"),(3,"test3")] for lt in list:
qq.put(lt) while qq.qsize() >0:
print(qq.get())

  

10、消费者生产者模型,解耦,相互不影响

import queue
import time
import threading
qu = queue.Queue(maxsize=) # 每次生产十个
def Producder():
while True:
for i in range(,):
print("生产了两个骨头")
qu.put("骨头 %s"%(i))
time.sleep() # 生产者消费者模型,多个人生产多个人消费。
def Consumer(name) :
while True:
print("%s 吃了一个骨头 %s"%(name,qu.get()))
time.sleep(0.5) #两个消费
c1 = threading.Thread(target=Consumer,args=("test1",))
c2 = threading.Thread(target=Consumer,args=("test2",))
pd1 = threading.Thread(target=Producder)
pd1.start()
c1.start()
c2.start()

多线程深入理解和守护线程、子线程、锁、queue、evenet等介绍的更多相关文章

  1. [Java][Android] 多线程同步-主线程等待全部子线程完毕案例

    有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...

  2. Unity3d 创建线程 子线程与主线程通信

    创建子线程 一,不带参数 Thread   resourcesLoadThread=new Thread (this.resourceLoadTxt); resourcesLoadThread.Sta ...

  3. NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程

    单词:thread 英 θred:n 线.思路.vt 穿过.vi 穿透过 一.    进程.线程 进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间 线程: ...

  4. Tasks遇到的一些坑,关于在子线程中对线程权限认证。

    一般情况下,不应该在执行多线程认证的时候对其子线程进行身份认证,如:A线程的子线程B和子线程C. 当使用 Parallel.ForEach方法时,只有自身线程能够拥有相对应的权限,其子线程权限则为NU ...

  5. Android——子线程操作主线程

    子线程不能直接操作主线程 UI线程 //水平进度条 public void jdt1_onclick(View view) { final ProgressDialog pd = new Progre ...

  6. C#子线程执行完后通知主线程

    其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿. 那么怎么让子线程去做主线程的事儿呢,我们只需要把主线程的方法传递给子线程就行了,那么传递方法就 ...

  7. C#子线程执行完后通知主线程(转)

    其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿.  那么怎么让子线程去做主线程的事儿呢,我们只需要把主线程的方法传递给子线程就行了,那么传递方法 ...

  8. 线程概念( 线程的特点,进程与线程的关系, 线程和python理论知识,线程的创建)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9041318.html 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运 ...

  9. python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)

    昨日内容回顾 队列 队列 : 先进先出.数据进程安全 队列实现方式: 管道 + 锁 生产者消费者模型 : 解决数据供需不平衡 管道 双向通信 数据进程不安全 EOFError: 管道是由操作系统进行引 ...

随机推荐

  1. MapReduce Design Patterns(chapter 2 (part 3))(四)

    Inverted Index Summarizations Pattern Description 反向索引模式在MapReduce分析中经常作为一个例子.我们将会讨论我们要创建的term跟标识符之间 ...

  2. ZOJ-3261 Connections in Galaxy War---离线操作+逆序并查集

    题目链接: https://cn.vjudge.net/problem/ZOJ-3261 题目大意: 给你一些点,还有一些边,每个点上都有一个权值,然后有一些询问,分为两种,query a 询问与a直 ...

  3. 报错 Filtered offsite request

    用scrapy框架迭代爬取时报错 scrapy日志: 在 setting.py 文件中 设置 日志 记录等级 LOG_LEVEL= 'DEBUG' LOG_FILE ='log.txt' 观察 scr ...

  4. Guava包学习---Sets

    Sets包的内容和上一篇中的Lists没有什么大的区别,里面有些细节可以看一下: 开始的创建newHashSet()的各个重载方法.newConcurrentHashSet()的重载方法.newTre ...

  5. 数论——扩展的欧几里德算法 - HDU2669

    http://acm.hdu.edu.cn/showproblem.php?pid=2669 #include <iostream> using namespace std; int gc ...

  6. Tomcat中的Filter

    Filter 节选部分源码.源码版本 Tomcat8.5 说明 filter 是 Servlet 规范 filter 是在 ,执行 Servlet.service方法之前执行 Filter相关接口 p ...

  7. 修改ubuntu计算机名

    修改计算机名下: -$sudo gedit /etc/hostname -$sudo gedit /etc/hosts

  8. Xcode 5.1安装插件:规范凝视生成器VVDocumenter

    类似java的多行凝视! 安装过程: 1.前往GitHub下载project文件:VVDocumenter-Xcode 2.用Xcode打开project,Command + B Build成功后,能 ...

  9. C/S模式,发布/订阅模式和PUSH/PULL模式(上)

    CS模式(客户端/服务器模式) 最场景的信息传递模式,也称为Request/Response模式,或者调用模式.http/https协议即此模式.因为最常用所以大家一般都比较熟悉,这里不重点讲了,大家 ...

  10. Knowledge Point 20180506 深究Java的跨平台特性

    本章主题:从骨子里看Java的跨平台;本文内容部分摘自https://www.cnblogs.com/roger-yu/p/5827452.html 有过基础Java知识的开发人员都知道Java是跨平 ...