1、简单的多线程例子

import threading,time
def b_fun(i):
print "____________b_fun start"
time.sleep(7)
print "________________b_fun end" def a_fun():
print "__________a_fun start"
t = threading.Thread(target=b_fun, args=(1,))
# t.setDaemon(True) #setDaemon()设置为False和没有这句话一个意思,设置为True,就是主线程a_fun函数不登t这个子线程了,a运行完,不管t运行完没有,a和t都结束,且setDaemon必须放在start()前面
    t.start()
print "__________1",
# t.join(3) #join()小括号中设置3的意思是,主线程a_fun函数运行到这的时候,等子线程t 3秒钟,三秒钟后不管子线程t结束没,a都继续运行下去,执行到return,主线程结束时子线程还可以继续在运行,直到结束
# 如果join小括号中没有设置,就代表,主线程在这个地方一直等着子线程结束后,主线程才继续执行下去
#如果这个地方没有join()这个方法,就代表,主线程不等子线程,主线程直接运行下去 print "__________a结束"
return "返回值"
cc=a_fun()
print cc 2、带通信的多线程
这种情况主要是,当一个多线程,开了几个子线程,想知道几个子线程的执行情况的时候用到
#带通信的多线程  Queue(队列,先进先出)
import threading,Queue,time
q=Queue.Queue() def c1(a1):
time.sleep(7)
print a1
q.put("c1 put 的内容")#put 存入到队列中 def c2(a1):
time.sleep(4)
print a1
q.put("c2 put 的内容")# put 存入到队列中 def a1():
print "a1开始_______"
cs1="第一个子线程cs1"
t1=threading.Thread(target=c1,args=(cs1,))
t1.start() cs2="第二个子线程cs2"
t2=threading.Thread(target=c2,args=(cs2,))
t2.start()
qq=q.get() #获取队列中的内容,并删除
if qq:      #如果队列中有内容,说明两个队列已经执行一个了
print qq a1() 如果在a1中想判断 两个线程是否都执行完了,可以用
  while True:
    if q.qsize()==2:
      print q.qsize()
      print q.get()
      break
3、生产消费模式
# encoding=utf-8
import threading
import time # python2中
from Queue import Queue #python3中
# from queue import Queue class Producer(threading.Thread):
def run(self):
global queue
count = 0
while True:
if queue.qsize() < 1000:
for i in range(10):
count = count +1
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() > 100:
for i in range(3):
msg = self.name + '消费了 '+queue.get()
print(msg)
time.sleep(1) if __name__ == '__main__':
queue = Queue() for i in range(10):
queue.put('初始产品'+str(i))
for i in range(2):
p = Producer() #生产
p.start()
for i in range(5):
c = Consumer() #消费
c.start() 4、互斥锁
from threading import Thread, Lock
import time g_num = 0 def test1():
global g_num
for i in range(1000000):
#True表示堵塞 即如果这个锁在上锁之前已经被上锁了,那么这个线程会在这里一直等待到解锁为止
#False表示非堵塞,即不管本次调用能够成功上锁,都不会卡在这,而是继续执行下面的代码
mutexFlag = mutex.acquire(True)
if mutexFlag:
g_num += 1
mutex.release() print("---test1---g_num=%d"%g_num) def test2():
global g_num
for i in range(1000000):
mutexFlag = mutex.acquire(True) #True表示堵塞
if mutexFlag:
g_num += 1
mutex.release() print("---test2---g_num=%d"%g_num) #创建一个互斥锁
#这个所默认是未上锁的状态
mutex = Lock() p1 = Thread(target=test1)
p1.start() p2 = Thread(target=test2)
p2.start() print("---g_num=%d---"%g_num) 5、线程池
from multiprocessing import Pool
import time
import os def test():
print("---进程池中的进程---pid=%d,ppid=%d--"%(os.getpid(),os.getppid()))
for i in range(3):
print("----%d---"%i)
time.sleep(1)
return "hahah" def test2(args):
print("---callback func--pid=%d"%os.getpid())
print("---callback func--args=%s"%args) pool = Pool(3)
pool.apply_async(func=test,callback=test2) #func 调用的函数,callback 回调的函数 time.sleep(5) print("----主进程-pid=%d----"%os.getpid())

python 多线程 及多线程通信,互斥锁,线程池的更多相关文章

  1. Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型

    Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: ​ ​ ​ 每个对象都对应于一个可称为" 互斥锁&qu ...

  2. Java多线程面试题:线程锁+线程池+线程同步等

    1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...

  3. (day29) 进程互斥锁 + 线程

    目录 进程互斥锁 队列和堆栈 进程间通信(IPC) 生产者和消费者模型 线程 什么是线程 为什么使用线程 怎么开启线程 线程对象的属性 线程互斥锁 进程互斥锁 进程间数据不共享,但是共享同一套文件系统 ...

  4. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  5. python多线程编程(3): 使用互斥锁同步线程

    问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的 ...

  6. python 使用多线程进行并发编程/互斥锁的使用

    import threading import time """ python的thread模块是比较底层的模块,python的threading模块是对thread做了 ...

  7. python多线程,event,互斥锁,死锁,递归锁,信号量

    Python多线程/event 多线程-threading python的thread模块是⽐较底层的模块, python的threading模块是对thread做了⼀些包装的, 可以更加⽅便的被使⽤ ...

  8. Python之网路编程之-互斥锁与进程间的通信(IPC)及生产者消费者模型

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  9. 2种方式(线程间通信/互斥锁)实现两个线程,一个线程打印1-52,另一个线程打印字母A-Z,打印顺序为12A34B56C......5152Z

    //2019/06/13 本周HT面试遇到的问题,答得不是很好,自己重新做一下.面试只需要写出线程间通信的方式,//我当时大致知道思路,因为之前看过马士兵老师的多线程视频,但是代码写出来估计编译都是报 ...

随机推荐

  1. 记一场与 cookie 的相遇

    简介: cookie 翻译过来为 “小甜点,一种酥性甜饼干,很美味的...”,咳咳,打住!我们这里说的是 “甜点” 文件,它是浏览器储存在用户电脑上的一小段纯文本格式的文件. 由于 http 是一种无 ...

  2. Studio 5000编程:如何判断AB PLC系统中的硬件设备是否在正常工作

    前言:PLC控制系统,主要由CPU.本机架I/O模块,分布式I/O模块,通信模块,或其他设备(如:伺服驱动器.交换机.第三方设备)等组成,如何判断这些设备是否工作正常?或是一旦出现故障,能在第一时间判 ...

  3. matplotlib 生成 eps 插入到 tex

    matplotlib 生成 eps 插入到 tex matplotlib 生成 eps,就可以插入到 tex 中,而且是矢量图,放大不失真. 而且因为图中的元素都是嵌入到 pdf 中,所以图中的文字也 ...

  4. hibernate之一对多,多对一

    配置文件 <!--一对多--><!--name:集合属性名字 column:外键列名 class:与它相关的对象的完整列名 cascade:级联操作:分3种 save-update: ...

  5. 生成唯一UUID

    目前有多种方式生成的UUID,根据算法,可确定是否唯一,使用IP和MAC自定义生成唯一主键较妥: // 获取MAC地址的方法 private static String getMACAddress(I ...

  6. SVM小白教程(2):拉格朗日对偶

    在上一篇文章中,我们推导出了 SVM 的目标函数: \[ \underset{(\mathbf{w},b)}{\operatorname{min}} ||\mathbf{w}|| \\ \operat ...

  7. A Discriminative Feature Learning Approach for Deep Face Recognition

    url: https://kpzhang93.github.io/papers/eccv2016.pdf year: ECCV2016 abstract 对于人脸识别任务来说, 网络学习到的特征具有判 ...

  8. flask蓝图的简单使用

    1.flask的简单使用 from flask import Flask # from flask import make_response app = Flask(__name__) app.con ...

  9. 快速搭建Docker Registry私有仓库

    前提条件: 服务器已经安装Docker(我的服务器是CentOS 7) 服务器已经安装Docker Compose 满足以上条件时就可以开始搭建了: 1. 生成用户密码文件:(运行下面命令后会在当前目 ...

  10. DDT驱动selenium自动化测试

    建两个.py文件分别是是读取xlsx文件内容,一个是测试用例使用ddt驱动 获取xlsx文件内容 import xlrd class ParseExcel(object): def __init__( ...