python互斥锁、加锁、同步机制、异步通信知识总结

某个线程要共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进入写入操作,从而保证了多线程情况下数据的正确性。

采用f_flag的方法效率低

创建锁

mutex=threading.Lock()

锁定

mutex.acquire([blocking])#里面可以加blocking(等待的时间)或者不加,不加就会一直等待(堵塞)

释放

mutex.release()

import threading
from threading import Thread
from threading import Lock
import time 

thnum=0
#两个线程都在抢着对这个锁进行上锁,如果有一方成功上锁,那么导致另外一方会堵塞(一直等待),到这个锁被解开为之
class MyThread(threading.Thread):
  def run(self):
    mutex.acquire()
    for i in range(10000):
      global thnum
      thnum+=1
    print(thnum)
    mutex.release()
def test():
  global thnum
  mutex.acquire() #等待可以上锁,通知而不是轮训,没有占用CPU
  for i in range(10000):
    thnum+=1
  print(thnum)
  mutex.release()#解锁
mutex=Lock()
if __name__=='__main__':
  t=MyThread()
  t.start() 

#创建一把互斥锁,默认是没有上锁的 

thn=Thread(target=test)
thn.start() 

'''''
10000
20000
''' 

只要一上锁,由多任务变为单任务,相当于只有一个线程在运行。

下面的代码相对上面加锁的时间变短了

import threading
from threading import Thread
from threading import Lock
import time 

thnum=0
#两个线程都在抢着对这个锁进行上锁,如果有一方成功上锁,那么导致另外一方会堵塞(一直等待),到这个锁被解开为之
class MyThread(threading.Thread):
  def run(self):
    for i in range(10000):
      mutex.acquire()
      global thnum
      thnum+=1
      mutex.release()#释放后,都开始抢,这样上锁的时间变短
    print(thnum) 

def test():
  global thnum
  for i in range(10000):
    mutex.acquire()
    thnum+=1
    mutex.release()#解锁
  print(thnum)
mutex=Lock()
if __name__=='__main__':
  t=MyThread()
  t.start() 

#创建一把互斥锁,默认是没有上锁的 

thn=Thread(target=test)
thn.start() 

'''''
10000
20000
''' 

只有必须加锁的地方才加锁

同步:按照预定的先后顺序执行

一个运行完后,释放下一个,下一个锁定后运行,再释放下一个,下一个锁定后,运行后释放下一个..... 释放第一个

异步:

#异步的实现
from multiprocessing import Pool
import time
import os 

#getpid()获取当前进程的进程号
#getppid()获取当前进程的父进程号 

def test():#子进程
  print("----进程池中的进程-----pid=%d,ppid=%d --"%(os.getpid(),os.getppid()))
  for i in range(3):
    print("-----%d----"%i)
    time.sleep(1)
  return "over" #子进程执行完后返回给操作系统,返回给父进程 

def test2(args):
  print("-----callback func----pid=%d"%os.getpid())#主进程调用test2
  print("------callback func---args=%s"%args) 

def main():
  pool=Pool(3)
  pool.apply_async(func=test,callback=test2)#回调
  time.sleep(5)#收到func进程结束后的信号后,执行回调函数test2 

  print("----主进程-pid = %d"%os.getpid()) 

if __name__=="__main__":
  #main()
  pool=Pool(3)
  pool.apply_async(test,callback=test2)#回调
  time.sleep(5)#收到func进程结束后的信号后,执行回调函数test2 

  print("----主进程-pid = %d"%os.getpid()) 

'''''显示结果不太正确,应该先运行test呀,再运行test2
-----callback func----pid=7044
------callback func---args=over
----主进程-pid = 7044
----进程池中的进程-----pid=3772,ppid=7044 --
-----0----
-----1----
-----2----
''' 
(0)

相关推荐

  • Python多进程并发与同步机制超详细讲解

    目录 多进程 僵尸进程 Process类 函数方式 继承方式 同步机制 状态管理Managers 在<多线程与同步>中介绍了多线程及存在的问题,而通过使用多进程而非线程可有效地绕过全局解释器锁. 因此,通过multiprocessing模块可充分地利用多核CPU的资源. 多进程 多进程是通过multiprocessing包来实现的,multiprocessing.Process对象(和多线程的threading.Thread类似)用来创建一个进程对象: 在类UNIX平台上,需要对每个Proce

  • python互斥锁、加锁、同步机制、异步通信知识总结

    某个线程要共享数据时,先将其锁定,此时资源的状态为"锁定",其他线程不能更改:直到该线程释放资源,将资源的状态变成"非锁定",其他的线程才能再次锁定该资源.互斥锁保证了每次只有一个线程进入写入操作,从而保证了多线程情况下数据的正确性. 采用f_flag的方法效率低 创建锁 mutex=threading.Lock() 锁定 mutex.acquire([blocking])#里面可以加blocking(等待的时间)或者不加,不加就会一直等待(堵塞) 释放 mutex

  • python多线程互斥锁与死锁问题详解

    目录 一.多线程共享全局变量 二.给线程加一把锁锁 三.死锁问题 总结 一.多线程共享全局变量 代码实现的功能: 创建work01与worker02函数,对全局变量进行加一操作创建main函数,生成两个线程,同时调用两个函数 代码如下: import threading result = 0 # 定义全局变量result def work1(num): global result for i in range(num): result += 1 print('------from work1--

  • Python实现的多线程同步与互斥锁功能示例

    本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading import time ''' #1.不加锁 num = 0 class MyThread(threading.Thread): def run(self): global num time.sleep(1) #一定要sleep!!! num = num + 1 msg = self.name + '

  • 对python多线程中互斥锁Threading.Lock的简单应用详解

    一.线程共享进程资源 每个线程互相独立,相互之间没有任何关系,但是在同一个进程中的资源,线程是共享的,如果不进行资源的合理分配,对数据造成破坏,使得线程运行的结果不可预期.这种现象称为"线程不安全". 实例如下: #-*- coding: utf-8 -*- import threading import time def test_xc(): f = open("test.txt","a") f.write("test_dxc&quo

  • 互斥锁解决 Python 中多线程共享全局变量的问题(推荐)

    一.同步概念 同步就是协同步调,按预定的先后次序进行运行.如:你说完,我再说. "同"字从字面上容易理解为一起动作. 其实不是,在这里,"同"字应是指协同.协助.互相配合. 线程同步,可理解为线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行:B执行,再将结果给A:A再继续操作. 之前我们遇到过,如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步. 解决线程同时修改全局变量的方式 我们

  • Java实现synchronized锁同步机制

    目录 synchronized 实现原理 适应性自旋(Adaptive Spinning) 锁升级 Java 对象头 偏向锁(Biased Locking) 偏向锁获取 偏向锁释放 关闭偏向锁 轻量级锁(Lightweight Locking) 轻量级锁获取 轻量级锁解锁 重量级锁 锁消除(Lock Elimination) 锁粗化(Lock Coarsening) 文末总结 synchronized 是 java 内置的同步锁实现,一个关键字实现对共享资源的锁定.synchronized 有

  • Python多线程与同步机制浅析

    目录 线程实现 Thread类 函数方式 继承方式 同步机制 同步锁Lock 条件变量Condition 信号量Semaphore 事件Event 屏障Barrier GIL全局解释器锁 线程实现 Python中线程有两种方式:函数或者用类来包装线程对象.threading模块中包含了丰富的多线程支持功能: threading.currentThread(): 返回当前线程: threading.enumerate(): 返回包含正在运行的线程列表: threading.activeCount(

  • 详解java中的互斥锁信号量和多线程等待机制

    互斥锁和信号量都是操作系统中为并发编程设计基本概念,互斥锁和信号量的概念上的不同在于,对于同一个资源,互斥锁只有0和1 的概念,而信号量不止于此.也就是说,信号量可以使资源同时被多个线程访问,而互斥锁同时只能被一个线程访问 互斥锁在java中的实现就是 ReetranLock , 在访问一个同步资源时,它的对象需要通过方法 tryLock() 获得这个锁,如果失败,返回 false,成功返回true.根据返回的信息来判断是否要访问这个被同步的资源.看下面的例子 public class Reen

  • 举例讲解Python中的死锁、可重入锁和互斥锁

    一.死锁 简单来说,死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁,这里结合例子说明下两种常见的死锁情况. 1.迭代死锁 该情况是一个线程"迭代"请求同一个资源,直接就会造成死锁: import threading import time class MyThread(threading.Thread): def run(self): global num time.sleep(1) if mutex.acquire(1): num = num+1 msg = se

随机推荐