线程之间,全局变量可以共享,但是局部变量依然是不共享的,线程的创建方式: threading.Thread(),还可以定义一个类继承Thread,重写他的run方法,具体和进程的写法一样.

那么,线程之前全局变量共享,如果两个线程同时修改一个全局变量,就会有一些麻烦,所以需要用到互斥锁:

from threading import Thread, Lock
import time g_num = def test1():
global g_num
mutex.acquire() <------------------------------
for i in range():
g_num +=
mutex.release() <-----------------------------
print(g_num) def test2():
global g_num
mutex.acquire() <----------------------
for i in range():
g_num +=
mutex.release() <------------------------
print(g_num) mutex = Lock() t1 = Thread(target=test1)
t1.start() t2 = Thread(target=test2)
t2.start() >>>

Lock() 是创建一把锁,用acquire() 的方式加锁 , release() 的方式解锁.  如果一个线程对一个变量加锁,剩下的线程就只能在等待,解锁之后用通知(还有一种耗费资源的方式是轮询) 的方式给等待的线程传递信息,锁已经解开.

需要注意应该避免死锁, Lock 的 acquire() 里面有两个参数 blocking=True 默认是True 如果已经上锁,那么就一直在这等,等到锁解开为止,也就是堵塞. 改成False 的话如果已上锁那么就跳过这个加锁操作,所以一般搭配 if 使用 加锁成功返回值True. 还有一个参数timeout=-1 ,默认-1.就是延迟,如果改成正数,那么就会在等待多少秒之后才放弃加锁.

同步 : 协同步调,按预定的先后次序运行. 异步:不确定什么时候运行.

threading.local() 创建一个对象,里面可以保存一些类似字典一样的参数,如 localVal = threading.local()

localVal.val = name这条语句可以储存一个变量到当前线程,如果在另外一个线程里面再次对localVal.val进行赋值,

那么会在另外一个线程单独创建内存空间来存储,也就是说在不同的线程里面赋值 不会覆盖之前的值,因为每个

线程里面都有一个单独的空间来保存这个数据,而且这个数据是隔离的,其他线程无法访问,就像这张图一样:

最后,生产者与消费者模型:

from queue import Queue
import time, threading class Producer(threading.Thread):
def run(self):
global queue
count =
while True:
if queue.qsize() < :
for i in range():
count = count +
msg = '生成产品' + str(count)
queue.put(msg)
print(msg)
time.sleep(0.5) class Consumer(threading.Thread):
def run(self):
global queue
while True:
if queue.qsize() > :
for i in range():
msg = self.name + '消费了' + queue.get()
print(msg)
time.sleep(0.5) if __name__ == '__main__':
queue = Queue() for i in range():
queue.put('初始产品' + str(i))
for i in range():
p = Producer()
p.start()
for i in range():
c = Consumer()
c.start()

from queue import Queue (python2 是 from Queue) 这是队列,先进先出,用来缓冲数据, 有 get put qsize 等方法,和进程的那个进程间通信的队列(from multiprocessing import Queue) 基本一样.

思路理解即可.

python__系统 : 线程的更多相关文章

  1. python__系统 : 线程池

    参考文档: https://www.jianshu.com/p/b9b3d66aa0be 使用  ThreadPoolExecutor  类,  as_completed 是迭代器, 如果有任务执行完 ...

  2. 于PsIsSystemThread无论是在线程系统线程标识获得

    我一直好奇一个进程的所有线程改变线程标志Terminated mov edi, edi ; IoIsSystemThread push ebp mov ebp, esp mov eax, [ebp+a ...

  3. 《Windows内核编程》---系统线程和同步事件

    系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE T ...

  4. linux系统——线程

    linux系统线程 1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个 ...

  5. jstack工具查看系统线程问题

    背景: 最近在做项目系统的异常测试,项目依赖于nkv,需要模拟依赖组件nkv异常时系统的响应及性能情况.通过tc工具模拟当服务器发送到nkv的请求超时时系统的响应.发现接口返回错误率100%,查看服务 ...

  6. python__系统 : socket_TCP补充,协程

    TCP 三次握手: SYN  -->  SYN+ACK  -->  ACK 四次挥手:  FIN --> ACK (FIN)  --> ACK TCP十种状态: LISTEN  ...

  7. python__系统 : 进程

    在类unix操作系统下,可以用 os.fork() 创建一个新的进程,windows系统不可以: import os ret = os.fork() print('ret=%d' % ret) : p ...

  8. swift中利用系统线程实现异步加载数据同步更新UI

    swift中的使用案例样式 // Mark: -数据源更新 typealias AddDataBlock = () ->Void var updataBlock:AddDataBlock? fu ...

  9. 记一次 医院.NET公众号系统 线程CPU双高分析

    一:背景 1. 讲故事 上周四有位朋友加wx咨询他的程序出现 CPU + 线程 双高的情况,希望我能帮忙排查下,如下图: 从截图看只是线程爆高,没看到 cpu 爆高哈,有意思的是这位朋友说他: 一直在 ...

随机推荐

  1. C语言答案解析

    1.设整型变量 a=2,则执行下列语句后,浮点型变量b的值不为0.5的是(  B ) A) b=1.0/a            B) b=(float)(1/a) C) b=1/(float)a   ...

  2. 安装BI Publisher Desktop报错:“Template Builder Installer Failed:Unexpected Error”

    原因:office的版本未安装正确,应该安装X86版本的,如果是X64的会出现,重新安装X86版本的office后解决问题.

  3. constrained属性

    hibernate文档上是这么写的: constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束.这个选项影响save ...

  4. Java—运算符和流程控制语句

    运算符优先级: siwtch语句注意事项: switch 后面小括号中表达式的值必须是整型或字符型 case 后面的值可以是常量数值,如 1.2:也可以是一个常量表达式,如 2+2 :但不能是变量或带 ...

  5. HCNA配置RIPv1

    1.拓扑图 2.配置 R1 The device is running! ###### <Huawei>sys Enter system view, return user view wi ...

  6. 3dsmax2014的下载、安装与注册激活教程详解

    3dsmax2014的下载.安装与注册激活教程,虽然网上类似的教程文章不胜枚举,但大多比较粗枝大叶,没有详细的步骤,尤其对于电脑小白来说,更是不易参考,今天我就教大家如何注册破解3dsmax2014吧 ...

  7. LA 3902 网络

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  8. 缓存头Cache-Control的含义和使用

    首先Cache-Control有哪些特性呢?一个是可缓存性 可缓存性 public: 代表这个http请求返回的内容所经过的任何路径中,包括一些中间的http的代理服务器,以及发出这个请求的客户端浏览 ...

  9. 安裝 PHP 時出現undefined reference to `libiconv_open’ 之類的錯誤訊息

    在安裝 PHP 到系統中時要是發生「undefined reference to `libiconv_open'」之類的錯誤訊息,那表示在「./configure 」沒抓好一些環境變數值.錯誤發生點在 ...

  10. Mac下安装OpenCV3.0和Anaconda和环境变量设置

    入手Mac几天了,想在Mac OS下玩玩OpenCV和keras,间歇捣鼓了两天,终于搞定zsh.OpenCV3.0以及Anaconda.OpenCV3.0刚发布不久,这方面的资料也不是很多,能够查到 ...