学习内容:

Python进程与线程

1、线程及线程类

2、线程守护

3、线程等待

4、线程锁

5、信号量

6、timer用法

7、队列

8、事件驱动

9、生产者消费者模型

10、进程及进程同步

11、进程池

12、递归锁

13、进程间通讯

一、线程及线程类

import threading
import time class MyThread(threading.Thread):
def __init__(self,num):
threading.Thread.__init__(self)
self.num = num def run(self):
print ('running on number :%s'%self.num)
print ('threading_act',threading.active_count() )
print ('threading_cur:',threading.current_thread())
time.sleep(3) if __name__ == '__main__':
t1 = MyThread('alex')
t2 = MyThread('json')
t1.start()
t2.start()
print (t1.getName())
print (t2.getName())
print('threading_c:', threading.current_thread())

二、线程守护

import threading
import time def run(n):
time.sleep(1)
print ("thread",n)
t_list = []
for i in range(10):
t = threading.Thread(target=run,args=(i,))
t.setDaemon(True)
t.start()
t_list.append(t)
print (t_list)
print ('----main thread----')

三、线程等待

import threading
import time
def run(n):
time.sleep(1)
print ("thread",n)
t_list = []
for i in range(10):
t = threading.Thread(target=run,args=(i,))
t.start()
t_list.append(t)
for t in t_list:
print ('t_list:',t)
t.join() #t.wait
print ('----main thread----')

四、线程锁

import  threading
import time l = threading.Lock()
def run(n):
global num
l.acquire() #获取锁
num += 1
time.sleep(1)
l.release() #释放锁
print(num)
time.sleep(1)
#print("thread",n)
def run2():
count = 0
while num < 9:
print ('---------',count)
count += 1
num = 0
t_list = []
for i in range(10):
t = threading.Thread(target=run, args=(i,))
t.start()
t_list.append(t)
t2 = threading.Thread(target=run2)
t2.start()
for t in t_list:
t.join()
print("--main thread---")
print(num)

五、信号量(多线程)

import threading, time

def run3(n):
semaphore.acquire()
time.sleep(1)
print('--------between run1 and run2-----',n)
semaphore.release()
if __name__ == '__main__':
num, num2 = 0, 0
semaphore = threading.BoundedSemaphore(5)
for i in range(20):
t = threading.Thread(target=run3,args=(i,))
t.start()
while threading.active_count() != 1:
pass
#print('active_count',threading.active_count())
else:
print('----all threads done---')
print(num, num2)

六、timer用法

import threading
import time
def hello():
print("hello, world")
t1 = time.time()
t = threading.Timer(3.0, hello)
t.start() # after 30 seconds, "hello, world" will be printed
t.join()
t2 = time.time()
change_time = t2 - t1
print (change_time)

七、队列

q = queue.Queue(maxsize=2)
# q.put(1)
# q.put(2)
# q.put(9)
# q.put('alex')
# q.put_nowait('jack')
# q.mutex
# q.qsize()
# q.join()
# q.task_done()
# q.empty() #判断队列是否为空
# q.full() #判断队列是否满
q=queue.LifoQueue()
q=queue.PriorityQueue()
q.put([4,'40'])
q.put([5,'50'])
q.put([1,'100'])
q.put([2,'20'])
print(q.get())
print(q.get())
print(q.get())
print(q.get())

八、事件驱动

import  threading
import time
import random
def lighter():
count = 0
while True:
if count < 30:
if not event_flag.is_set():
event_flag.set()
print ('\033[32m----green light----\033[0m:%s'%count)
elif count < 35:
print('\033[33m----green light----\033[0m:%s' %count)
elif count < 60:
if event_flag.is_set():
event_flag.clear()
print('\033[31m----green light----\033[0m:%s' %count)
else:
count = 0
count += 1
time.sleep(0.2)
def car(n):
while True:
event_flag.wait()
print ('car [%s] is running throught the lighter...'%n)
time.sleep(random.randint(0, 3))
event_flag = threading.Event()
light_flag = threading.Thread(target=lighter)
light_flag.start()
car_list = ['宝马','大奔','路虎','兰博基尼','夏利']
for n in car_list:
car_flag = threading.Thread(target=car,args=(n,))
car_flag.start()

九、生产者消费者模型

import threading
import queue
import time
def consumer(name):
while True:
print ('%s 取到 骨头 【%s】,并吃了它。'%(name,q.get()))
time.sleep(0.5)
q.task_done() #回执
def producer(name):
count = 0
#while q.qsize() < 6:
for i in range (10):
print ('%s生成了骨头 %s!'%(name,count) )
q.put(count)
count +=1
time.sleep(0.3)
q.join()
q = queue.Queue(maxsize=5)
p = threading.Thread(target=producer,args=('Alex',))
p2 = threading.Thread(target=producer,args=('shuangmei',))
c = threading.Thread(target=consumer,args=('spider',))
p.start()
p2.start()
c.start()

十、进程及进程同步

from multiprocessing import Process, Lock
#作用:输出到屏幕出现乱行,加锁保证不串行 def f(l, i):
l.acquire()
try:
print('hello world', i)
finally:
l.release()
if __name__ == '__main__':
lock = Lock()
for num in range(10):
Process(target=f, args=(lock, num)).start()

十一、进程池

from multiprocessing import Process, Lock,Pool
import time
import os
#作用:输出到屏幕出现乱行,加锁保证不串行 def f(i):
#l.acquire()
print('hello world', i)
print ('-----f:',i,os.getpid())
time.sleep(4)
#l.release()
def callback(data):
print ('exec done---',data)
print('----callback',data,os.getpid()) if __name__ == '__main__':
lock = Lock()
pool = Pool(processes=5)
for num in range(10):
#Process(target=f, args=(lock, num)).start()
#pool.apply_async(func=f, args=(lock,num), callback=Bar)
pool.apply_async(func=f, args=(num,),callback=callback)
#apply 不要用,就用apply_async即可
pool.close()
pool.join()

十二、递归锁

import threading, time
def run1():
print("grab the first part data")
lock.acquire()
global num
num += 1
lock.release()
return num
def run2():
print("grab the second part data")
lock.acquire()
global num2
num2 += 1
lock.release()
return num2
def run3():
lock.acquire()
res = run1()
print('--------between run1 and run2-----')
res2 = run2()
lock.release()
print(res, res2)
if __name__ == '__main__':
num, num2 = 0, 0
lock = threading.RLock() #若用lock 则死锁
for i in range(10):
t = threading.Thread(target=run3)
t.start()
while threading.active_count() != 1:
print('active_count',threading.active_count())
else:
print('----all threads done---')
print(num, num2)

十三、进程间通讯

from multiprocessing import Process,Queue  #进程的queue
import queue #线程的queue
def f(q):
q.put([42, None, 'hello'])
q.put(123)
if __name__ == '__main__':
#q=queue.Queue #线程的队列
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print(q.get()) # prints "[42, None, 'hello']"
print (q.get())
p.join()

PYTHON学习之路_PYTHON基础(10)的更多相关文章

  1. PYTHON学习之路_PYTHON基础(1)

    学习内容: 1.Python介绍 2.Python程序初接触和变量 3.Python用户交互 4.Python数据类型 5.Python循环if...(elif)...else 6.Python循环w ...

  2. PYTHON学习之路_PYTHON基础(6)

    学习内容: Python模块介绍 1.time &datetime模块 2.random 3.shutil 4.shelve 5.xml处理 6.configparser 7.hashlib ...

  3. PYTHON学习之路_PYTHON基础(4)

    学习内容: 1.Python函数的基本语法 2.Python函数的返回值与变量 3.Python嵌套函数 4.Python递归函数及实例(二分查找) 5.Python匿名函数 6.Python内置方法 ...

  4. PYTHON学习之路_PYTHON基础(3)

    学习内容: 1.Python字典 2.Python集合 3.Python字符编码 4.Python文件操作 5.Python实例 一.Python字典 1.定义: dic1={'name':'alex ...

  5. PYTHON学习之路_PYTHON基础(8)

    学习内容: Python模块介绍 1.经典类 or 新式类 2.抽象接口 3.静态方法.类方法.属性方法 4.反射 5.异常处理 6.socket编程初识 7.用socket实现get.put文件等功 ...

  6. PYTHON学习之路_PYTHON基础(2)

    学习内容: 1.Python数据类型与变量 2.Python字符串 3.Python列表 4.Python while循环 5.Python字典 6.Python实例 一.Python数据类型与变量 ...

  7. python学习之路-day2-pyth基础2

    一.        模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...

  8. Python学习之路-Day2-Python基础2

    Python学习之路第二天 学习内容: 1.模块初识 2.pyc是什么 3.python数据类型 4.数据运算 5.bytes/str之别 6.列表 7.元组 8.字典 9.字符串常用操作 1.模块初 ...

  9. Python学习之路-Day1-Python基础

    学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...

随机推荐

  1. Spring整合jdbc

    首先web.xml文件跟往常一样,加载spring容器和加载org.springframework.web.context.ContextLoaderListener读取applicationCont ...

  2. 预习笔记 多态 --S2 4.3

    第三章 多态 polymorphism 多态 instance 例子override 重载 constructor 构造器ClassCastException 类型转换异常upcasting 上抛 d ...

  3. Socket粘包问题

    这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题,发现自己不是很清楚,所以查资料了解记录一下: 一两个简单概念长连接与短连接:1.长连接 Client方与Server方先建立通 ...

  4. Git使用心得

    1.git是分布式的版本控制(有本地仓库)git 先对安全 2.git基于元数据   svn是基于目录的 3.本地的提交分为三个步骤(提交本地仓库先提交暂存区再提交本地仓库) 工作区         ...

  5. modelsim搭建uvm环境及实例

    Modelsim SE-64 10.2c 自带编译好的uvm-1.1d 脚本new_run.do set UVM_DPI_HOME C:/modeltech64_10.2c/uvm-1.1d/win6 ...

  6. c++ cout介绍与实现自己的cout

    C++编程语言互换流中的标准输出流,需要iostream支持.读为 "c out([si:‘aʊt]". 名字 cout 类型 std::ostream 读为 "c ou ...

  7. 由Struts return SUCCESS引发的基础问题

    该问题的最初来源,是源于Struts中的 return SUCCESS; 和 return "success"; 在Struts的配置文件struts.xml我们可以找到" ...

  8. java javacv调用摄像头并拍照

    调用摄像头并拍张照片,我一开始用的java的jmf媒体框架,但这个有很多的局限性不好使并且很有麻烦,兜了一圈发现javacv东西,研究之后这东西简单,方便:废话不多说了来重点. javacv官网:点击 ...

  9. (转)selenuim-webdriver注解之@FindBy、@FindBys、@FindAll的区别

    selenium-webdriver中获取页面元素的方式有很多,使用注解获取页面元素是其中一种途径, 方式有3种:@FindBy.@FindBys.@FindAll.下文对3中类型的区别和使用场景进行 ...

  10. coredump

    COREDUMP调试的使用 一,什么是coredump 跑程序的时候经常碰到SIGNAL 或者 call trace的问题,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程 ...