案例01:
'''
利用time函数,生成两个函数
顺序调用
计算总的运行时间
'''
import time
def loop1():
# ctime 得到当前时间
print('Start loop 1 at :', time.ctime())
# 睡眠多长时间,单位是秒
time.sleep(4)
print('End loop 1 at:', time.ctime())
def loop2():
# ctime 得到当前时间
print('Start loop 2 at :', time.ctime())
# 睡眠多长时间,单位是秒
time.sleep(2)
print('End loop 2 at:', time.ctime())
def main():
print("Starting at:", time.ctime())
loop1()
loop2()
print("All done at:", time.ctime())
if __name__ == '__main__':
main()
案例02:
'''
利用time函数,生成两个函数
顺序调用
计算总的运行时间
'''
import time
import _thread as thread
def loop1():
# ctime 得到当前时间
print('Start loop 1 at :', time.ctime())
# 睡眠多长时间,单位是秒
time.sleep(4)
print('End loop 1 at:', time.ctime())
def loop2():
# ctime 得到当前时间
print('Start loop 2 at :', time.ctime())
# 睡眠多长时间,单位是秒
time.sleep(2)
print('End loop 2 at:', time.ctime())
def main():
print("Starting at:", time.ctime())
# 启动多线程的意思是用多线程去执行某个函数
# 启动多线程函数为start_new_thead
# 参数两个,一个是需要运行的函数名,第二是函数的参数作为元组使用,为空则使用空元组
# 注意:如果函数只有一个参数,需要参数后由一个逗号
thread.start_new_thread(loop1, ())
thread.start_new_thread(loop2, ())
print("All done at:", time.ctime())
if __name__ == '__main__':
main()
while True:
time.sleep(1)
案例03:
#利用time延时函数,生成两个函数
# 利用多线程调用
# 计算总运行时间
# 练习带参数的多线程启动方法
import time
# 导入多线程包并更名为thread
import _thread as thread
def loop1(in1):
# ctime 得到当前时间
print('Start loop 1 at :', time.ctime())
# 把参数打印出来
print("我是参数 ",in1)
# 睡眠多长时间,单位是秒
time.sleep(4)
print('End loop 1 at:', time.ctime())
def loop2(in1, in2):
# ctime 得到当前时间
print('Start loop 2 at :', time.ctime())
# 把参数in 和 in2打印出来,代表使用
print("我是参数 " ,in1 , "和参数 ", in2)
# 睡眠多长时间,单位是秒
time.sleep(2)
print('End loop 2 at:', time.ctime())
def main():
print("Starting at:", time.ctime())
# 启动多线程的意思是用多线程去执行某个函数
# 启动多线程函数为start_new_thead
# 参数两个,一个是需要运行的函数名,第二是函数的参数作为元组使用,为空则使用空元组
# 注意:如果函数只有一个参数,需要参数后由一个逗号
thread.start_new_thread(loop1, ("王老大", )) #多线程可以带参数,后面加上逗号表示元组
thread.start_new_thread(loop2, ("王大鹏", "王晓鹏"))
print("All done at:", time.ctime())
if __name__ == "__main__":
main()
# 一定要有while语句
# 因为启动多线程后本程序就作为主线程存在
# 如果主线程执行完毕,则子线程可能也需要终止
while True:
time.sleep(10)
案例04:
#利用time延时函数,生成两个函数
# 利用多线程调用
# 计算总运行时间
# 练习带参数的多线程启动方法
import time
# 导入多线程处理包
import threading
def loop1(in1):
# ctime 得到当前时间
print('Start loop 1 at :', time.ctime())
# 把参数打印出来
print("我是参数 ",in1)
# 睡眠多长时间,单位是秒
time.sleep(4)
print('End loop 1 at:', time.ctime())
def loop2(in1, in2):
# ctime 得到当前时间
print('Start loop 2 at :', time.ctime())
# 把参数in 和 in2打印出来,代表使用
print("我是参数 " ,in1 , "和参数 ", in2)
# 睡眠多长时间,单位是秒
time.sleep(2)
print('End loop 2 at:', time.ctime())
def main():
print("Starting at:", time.ctime())
# 生成threading.Thread实例
t1 = threading.Thread(target=loop1, args=("王老大",))
t1.start()
t2 = threading.Thread(target=loop2, args=("王大鹏", "王小鹏"))
t2.start()
print("All done at:", time.ctime())
if __name__ == "__main__":
main()
# 一定要有while语句
# 因为启动多线程后本程序就作为主线程存在
# 如果主线程执行完毕,则子线程可能也需要终止
while True:
time.sleep(10)
案例05:
#利用time延时函数,生成两个函数
# 利用多线程调用
# 计算总运行时间
# 练习带参数的多线程启动方法
import time
# 导入多线程处理包
import threading
def loop1(in1):
# ctime 得到当前时间
print('Start loop 1 at :', time.ctime())
# 把参数打印出来
print("我是参数 ",in1)
# 睡眠多长时间,单位是秒
time.sleep(4)
print('End loop 1 at:', time.ctime())
def loop2(in1, in2):
# ctime 得到当前时间
print('Start loop 2 at :', time.ctime())
# 把参数in 和 in2打印出来,代表使用
print("我是参数 " ,in1 , "和参数 ", in2)
# 睡眠多长时间,单位是秒
time.sleep(2)
print('End loop 2 at:', time.ctime())
def main():
print("Starting at:", time.ctime())
# 生成threading.Thread实例
t1 = threading.Thread(target=loop1, args=("王老大",))
t1.start()
t2 = threading.Thread(target=loop2, args=("王大鹏", "王小鹏"))
t2.start()
t1.join()
t2.join()
print("All done at:", time.ctime())
if __name__ == "__main__":
main()
# 一定要有while语句
# 因为启动多线程后本程序就作为主线程存在
# 如果主线程执行完毕,则子线程可能也需要终止
while True:
time.sleep(10)
案例06:
import time
import threading
def fun():
print("Start fun")
time.sleep(2)
print("end fun")
print("Main thread")
t1 = threading.Thread(target=fun, args=() )
t1.start()
time.sleep(1)
print("Main thread end")
案例07:
import time
import threading
def fun():
print("Start fun")
time.sleep(2)
print("end fun")
print("Main thread")
t1 = threading.Thread(target=fun, args=() )
# 社会守护线程的方法,必须在start之前设置,否则无效
t1.setDaemon(True)
#t1.daemon = True
t1.start()
time.sleep(1)
print("Main thread end")
案例08:
import time
import threading
def loop1():
# ctime 得到当前时间
print('Start loop 1 at :', time.ctime())
# 睡眠多长时间,单位是秒
time.sleep(6)
print('End loop 1 at:', time.ctime())
def loop2():
# ctime 得到当前时间
print('Start loop 2 at :', time.ctime())
# 睡眠多长时间,单位是秒
time.sleep(1)
print('End loop 2 at:', time.ctime())
def loop3():
# ctime 得到当前时间
print('Start loop 3 at :', time.ctime())
# 睡眠多长时间,单位是秒
time.sleep(5)
print('End loop 3 at:', time.ctime())
def main():
print("Starting at:", time.ctime())
# 生成threading.Thread实例
t1 = threading.Thread(target=loop1, args=( ))
# setName是给每一个子线程设置一个名字
t1.setName("THR_1")
t1.start()
t2 = threading.Thread(target=loop2, args=( ))
t2.setName("THR_2")
t2.start()
t3 = threading.Thread(target=loop3, args=( ))
t3.setName("THR_3")
t3.start()
# 预期3秒后,thread2已经自动结束,
time.sleep(3)
# enumerate 得到正在运行子线程,即子线程1和子线程3
for thr in threading.enumerate():
# getName能够得到线程的名字
print("正在运行的线程名字是: {0}".format(thr.getName()))
print("正在运行的子线程数量为: {0}".format(threading.activeCount()))
print("All done at:", time.ctime())
if __name__ == "__main__":
main()
# 一定要有while语句
# 因为启动多线程后本程序就作为主线程存在
# 如果主线程执行完毕,则子线程可能也需要终止
while True:
time.sleep(10)
案例09:
import threading
import time
# 1. 类需要继承自threading.Thread
class MyThread(threading.Thread):
def __init__(self, arg):
super(MyThread, self).__init__()
self.arg = arg
# 2 必须重写run函数,run函数代表的是真正执行的功能
def run(self):
time.sleep(2)
print("The args for this class is {0}".format(self.arg))
for i in range(5):
t = MyThread(i)
t.start()
t.join()
print("Main thread is done!!!!!!!!")
案例10:
import threading
from time import sleep, ctime
loop = [4,2]
class ThreadFunc:
def __init__(self, name):
self.name = name
def loop(self, nloop, nsec):
'''
:param nloop: loop函数的名称
:param nsec: 系统休眠时间
:return:
'''
print('Start loop ', nloop, 'at ', ctime())
sleep(nsec)
print('Done loop ', nloop, ' at ', ctime())
def main():
print("Starting at: ", ctime())
# ThreadFunc("loop").loop 跟一下两个式子相等:
# t = ThreadFunc("loop")
# t.loop
# 以下t1 和 t2的定义方式相等
t = ThreadFunc("loop")
t1 = threading.Thread( target = t.loop, args=("LOOP1", 4))
# 下面这种写法更西方人,工业化一点
t2 = threading.Thread( target = ThreadFunc('loop').loop, args=("LOOP2", 2))
# 常见错误写法
#t1 = threading.Thread(target=ThreadFunc('loop').loop(100,4))
#t2 = threading.Thread(target=ThreadFunc('loop').loop(100,2))
t1.start()
t2.start()
t1.join( )
t2.join()
print("ALL done at: ", ctime())
if __name__ == '__main__':
main()
案例11:
import threading
sum = 0
loopSum = 1000000
def myAdd():
global sum, loopSum
for i in range(1, loopSum):
sum += 1
def myMinu():
global sum, loopSum
for i in range(1, loopSum):
sum -= 1
if __name__ == '__main__':
print("Starting ....{0}".format(sum))
# 开始多线程的实例,看执行结果是否一样
t1 = threading.Thread(target=myAdd, args=())
t2 = threading.Thread(target=myMinu, args=())
t1.start()
t2.start()
t1.join()
t2.join()
print("Done .... {0}".format(sum))
案例12:
import threading
sum = 0
loopSum = 1000000
lock = threading.Lock()
def myAdd():
global sum, loopSum
for i in range(1, loopSum):
# 上锁,申请锁
lock.acquire()
sum += 1
# 释放锁
lock.release()
def myMinu():
global sum, loopSum
for i in range(1, loopSum):
lock.acquire()
sum -= 1
lock.release()
if __name__ == '__main__':
print("Starting ....{0}".format(sum))
# 开始多线程的实例,看执行结果是否一样
t1 = threading.Thread(target=myAdd, args=())
t2 = threading.Thread(target=myMinu, args=())
t1.start()
t2.start()
t1.join()
t2.join()
print("Done .... {0}".format(sum))
案例13:
#encoding=utf-8
import threading
import time
# Python2
# from Queue import Queue
# Python3
import queue
class Producer(threading.Thread):
def run(self):
global queue
count = 0
while True:
# qsize返回queue内容长度
if queue.qsize() < 1000:
for i in range(100):
count = count +1
msg = '生成产品'+str(count)
# put是网queue中放入一个值
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):
# get是从queue中取出一个值
msg = self.name + '消费了 '+queue.get()
print(msg)
time.sleep(1)
if __name__ == '__main__':
queue = queue.Queue()
for i in range(500):
queue.put('初始产品'+str(i))
for i in range(2):
p = Producer()
p.start()
for i in range(5):
c = Consumer()
c.start()
案例14:
import threading
import time
lock_1 = threading.Lock()
lock_2 = threading.Lock()
def func_1():
print("func_1 starting.........")
lock_1.acquire()
print("func_1 申请了 lock_1....")
time.sleep(2)
print("func_1 等待 lock_2.......")
lock_2.acquire()
print("func_1 申请了 lock_2.......")
lock_2.release()
print("func_1 释放了 lock_2")
lock_1.release()
print("func_1 释放了 lock_1")
print("func_1 done..........")
def func_2():
print("func_2 starting.........")
lock_2.acquire()
print("func_2 申请了 lock_2....")
time.sleep(4)
print("func_2 等待 lock_1.......")
lock_1.acquire()
print("func_2 申请了 lock_1.......")
lock_1.release()
print("func_2 释放了 lock_1")
lock_2.release()
print("func_2 释放了 lock_2")
print("func_2 done..........")
if __name__ == "__main__":
print("主程序启动..............")
t1 = threading.Thread(target=func_1, args=())
t2 = threading.Thread(target=func_2, args=())
t1.start()
t2.start()
t1.join()
t2.join()
print("主程序启动..............")
案例15:
import threading
import time
lock_1 = threading.Lock()
lock_2 = threading.Lock()
def func_1():
print("func_1 starting.........")
lock_1.acquire(timeout=4)
print("func_1 申请了 lock_1....")
time.sleep(2)
print("func_1 等待 lock_2.......")
rst = lock_2.acquire(timeout=2)
if rst:
print("func_1 已经得到锁 lock_2")
lock_2.release()
print("func_1 释放了锁 lock_2")
else:
print("func_1 注定没申请到lock_2.....")
lock_1.release()
print("func_1 释放了 lock_1")
print("func_1 done..........")
def func_2():
print("func_2 starting.........")
lock_2.acquire()
print("func_2 申请了 lock_2....")
time.sleep(4)
print("func_2 等待 lock_1.......")
lock_1.acquire()
print("func_2 申请了 lock_1.......")
lock_1.release()
print("func_2 释放了 lock_1")
lock_2.release()
print("func_2 释放了 lock_2")
print("func_2 done..........")
if __name__ == "__main__":
print("主程序启动..............")
t1 = threading.Thread(target=func_1, args=())
t2 = threading.Thread(target=func_2, args=())
t1.start()
t2.start()
t1.join()
t2.join()
print("主程序结束..............")
案例16:
import threading
import time
# 参数定义最多几个线程同时使用资源
semaphore = threading.Semaphore(3)
def func():
if semaphore.acquire():
for i in range(5):
print(threading.currentThread().getName() + ' get semaphore')
time.sleep(15)
semaphore.release()
print(threading.currentThread().getName() + ' release semaphore')
for i in range(8):
t1 = threading.Thread(target=func)
t1.start()
案例17:
import threading
import time
def func():
print("I am running.........")
time.sleep(4)
print("I am done......")
if __name__ == "__main__":
t = threading.Timer(6, func)
t.start()
i = 0
while True:
print("{0}***************".format(i))
time.sleep(3)
i += 1
案例18:
import threading
import time
class MyThread(threading.Thread):
def run(self):
global num
time.sleep(1)
if mutex.acquire(1):
num = num+1
msg = self.name+' set num to '+str(num)
print(msg)
mutex.acquire()
mutex.release()
mutex.release()
num = 0
mutex = threading.RLock()
def testTh():
for i in range(5):
t = MyThread()
t.start()
if __name__ == '__main__':
testTh()
案例19:
import multiprocessing
from time import sleep, ctime
def clock(interval):
while True:
print("The time is %s" % ctime())
sleep(interval)
if __name__ == '__main__':
p = multiprocessing.Process(target = clock, args = (5,))
p.start()
while True:
print('sleeping.......')
sleep(1)
案例20:
import multiprocessing
from time import sleep, ctime
class ClockProcess(multiprocessing.Process):
'''
两个函数比较重要
1. init构造函数
2. run
'''
def __init__(self, interval):
super().__init__()
self.interval = interval
def run(self):
while True:
print("The time is %s" % ctime())
sleep(self.interval)
if __name__ == '__main__':
p = ClockProcess(3)
p.start()
while True:
print('sleeping.......')
sleep(1)
案例21:
from multiprocessing import Process
import os
def info(title):
print(title)
print('module name:', __name__)
# 得到父亲进程的id
print('parent process:', os.getppid())
# 得到本身进程的id
print('process id:', os.getpid())
def f(name):
info('function f')
print('hello', name)
if __name__ == '__main__':
info('main line')
p = Process(target=f, args=('bob',))
p.start()
p.join()
案例22:
import multiprocessing
from time import ctime
def consumer(input_q):
print("Into consumer:", ctime())
while True:
# 处理项
item = input_q.get()
print ("pull", item, "out of q") # 此处替换为有用的工作
input_q.task_done() # 发出信号通知任务完成
print ("Out of consumer:", ctime()) ##此句未执行,因为q.join()收集到四个task_done()信号后,主进程启动,未等到print此句完成,程序就结束了
def producer(sequence, output_q):
print ("Into procuder:", ctime())
for item in sequence:
output_q.put(item)
print ("put", item, "into q")
print ("Out of procuder:", ctime())
# 建立进程
if __name__ == '__main__':
q = multiprocessing.JoinableQueue()
# 运行消费者进程
cons_p = multiprocessing.Process (target = consumer, args = (q,))
cons_p.daemon = True
cons_p.start()
# 生产多个项,sequence代表要发送给消费者的项序列
# 在实践中,这可能是生成器的输出或通过一些其他方式生产出来
sequence = [1,2,3,4]
producer(sequence, q)
# 等待所有项被处理
q.join()
案例23:
import multiprocessing
from time import ctime
# 设置哨兵问题
def consumer(input_q):
print("Into consumer:", ctime())
while True:
item = input_q.get()
if item is None:
break
print("pull", item, "out of q")
print ("Out of consumer:", ctime()) ## 此句执行完成,再转入主进程
def producer(sequence, output_q):
print ("Into procuder:", ctime())
for item in sequence:
output_q.put(item)
print ("put", item, "into q")
print ("Out of procuder:", ctime())
if __name__ == '__main__':
q = multiprocessing.Queue()
cons_p = multiprocessing.Process(target = consumer, args = (q,))
cons_p.start()
sequence = [1,2,3,4]
producer(sequence, q)
q.put(None)
cons_p.join()
案例24:
import multiprocessing
from time import ctime
def consumer(input_q):
print ("Into consumer:", ctime())
while True:
item = input_q.get()
if item is None:
break
print("pull", item, "out of q")
print ("Out of consumer:", ctime())
def producer(sequence, output_q):
for item in sequence:
print ("Into procuder:", ctime())
output_q.put(item)
print ("Out of procuder:", ctime())
if __name__ == '__main__':
q = multiprocessing.Queue()
cons_p1 = multiprocessing.Process (target = consumer, args = (q,))
cons_p1.start()
cons_p2 = multiprocessing.Process (target = consumer, args = (q,))
cons_p2.start()
sequence = [1,2,3,4]
producer(sequence, q)
q.put(None)
q.put(None)
cons_p1.join()
cons_p2.join()