python 多线程+queue

原文链接: https://www.jianshu.com/

两种定义线程方法

1调用threading.Thread(target=目标函数,args=(目标函数的传输内容))(简洁方便)

2创建一个类继承与(threading.Thread)并重构run()函数

class MyThread(threading.Thread):
    def run(self):

1.直接调用函数方法实例

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import threading,time

def run(n):
    print("test",n)
    time.sleep(2)
start_time=time.time()
tall=[]             #用作储存线程实例
for i in range(50):
    t=threading.Thread(target=run,args=('t-%s'%i,))
    t.setDaemon(True)  #把当前线程设置为守护线程
    t.start()
    tall.append(t)

# for t in tall:
#     t.join()
print("time:",time.time()-start_time)
print(threading.active_count())

①继承类
②实例化 示例

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import threading,time
class MyThread(threading.Thread):
    def __init__(self,n):
        super(MyThread,self).__init__()
        self.n=n
    def run(self):
        print("running task",self.n)

t1=MyThread("t1")
t2=MyThread("t2")
t1.start()
t2.start()

补充:

1两个进程一起进行 线程.join()等待该线程执行完毕后 在进行之后操作

2整个程序有主线程,会和其他线程并行

3可将线程储存在数组里

4 t.setDaemon(True) #把当前线程设置为守护线程-主线程结束守护线程自动结束(主仆关系)

5 t.start()调用start函数代表线程开始

================================================

同步对象 event

可调用的函数
#event.wait()      使当前线程等待 直到被设定
#event.set()        设定标志位
#event.is_set()     判断是否被设定
#event.clear()      清除设定
以下是对红绿灯的示例
灯为一线程
车为一线程
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import time
import threading
event=threading.Event()
def lighter():
    count=0
    event.set()
    while True:
        time.sleep(1)
        if count>4 and count<10:    #改为红灯
            event.clear()
            print("\033[41;1mred light is on...\033[0m")
        elif count>=10:
            event.set()
            count=0
        else:
            print("\033[42;1mgreen light is on...\033[0m")
        time.sleep(1)
        count+=1
def car(name):
    while True:
        if event.is_set():
            print(name,"is going")
            time.sleep(1)
        else:
            print(name,"stop!")
            event.wait()
car1=threading.Thread(target=car,args=("宝马",))
car1.start()
t=threading.Thread(target=lighter,)
t.start()

注意:

1先实例化event对象 event=threading.Event()

2利用上方红字4个event函数调用 达到多线程交互进行

3threading.Thread(target=car,args=(“宝马”,)) 在实例化线程时threading.Thread(target=调用的函数名,args=(参数,))  //必须使用元组形式

==========================================================

queue队列

q=queue.Queue(maxsize=5) 首先实例化队列 可以自定最大值需要maxsize=

1q.put()  //向队列中塞一个

2q.get()  //从队列中取一个

最多塞maxsize个 最少为0个 取一个后,此数据将不存在

以下是对queue的实例

提供者与两个消费者三线程

提供者最多产5个

import queue,threading,time
q=queue.Queue(maxsize=5)
def produce(name):
    count=0
    while True:
        count+=1
        # print(count)
        q.put("%s生产%s个面包"%(name,count))
        print("产了",count)
        time.sleep(0.2)
def consumer(name):
    while True:
        print(name,"is eating ",q.get())
        time.sleep(1)
a=threading.Thread(target=produce,args=("cf",))
b=threading.Thread(target=consumer,args=("xxx",))
c=threading.Thread(target=consumer,args=("sss",))
a.start()
b.start()
c.start()

注意:

q=queue.Queue(maxsize=5)务必使用前实例化!!

猜你喜欢

转载自blog.csdn.net/sinat_38682860/article/details/100559574