python创建线程

1 使用threading模块创建线程

import  threading,time

def progress():
    print("thread niame is %s -----"%threading.current_thread().name)


if __name__ == '__main__':
    print('~~主线程开始~~')
    threads=[threading.Thread(target=progress) for i in range(4)]#创建似四个线程存入列表
    for t in threads:
        t.start()
        time.sleep(1)
    for t in threads:
        t.join()
    print('~~主线程结束~~')

执行结果:

~~主线程开始~~
thread niame is Thread-1 -----
thread niame is Thread-2 -----
thread niame is Thread-3 -----
thread niame is Thread-4 -----
~~主线程结束~~

2 使用thread子类创建线程

import  threading,time

class SubThread(threading.Thread):
    def run(self):
        for i in range(3):
            time.sleep(1)
            msg="子线程"+self.name+"执行,i="+str(i)
            print(msg)



if __name__ == '__main__':
    print('~~主线程开始~~')
    t1=SubThread()
    t2=SubThread()
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print('~~主线程结束~~')

运行结果如下:

~~主线程开始~~
子线程Thread-1执行,i=0
子线程Thread-2执行,i=0
子线程Thread-1执行,i=1
子线程Thread-2执行,i=1
子线程Thread-1执行,i=2
子线程Thread-2执行,i=2
~~主线程结束~~

3 应用全局变量进行线程之间通讯

在一个进程内的所有线程共享全局变量。

import threading,time
from threading import Thread

def plus():
    print("子线程加法开始")
    global g_num
    g_num += 50
    print("全局变量值%s"%g_num)
    print("子线程加法结束")
def minus():
    print("子线程减法开始")
    global g_num
    g_num -= 50
    print("全局变量值%s"%g_num)
    print("子线程减法结束")


g_num=100               #定义一个全局变量
.
if __name__ == '__main__':
    print('~~主线程开始~~')
    print("全局变量值%s" % g_num)
    t1=Thread(target=plus)
    t2=Thread(target=minus)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print('~~主线程结束~~')

执行结果:

~~主线程开始~~
全局变量值100
子线程加法开始
全局变量值150
子线程加法结束
子线程减法开始
全局变量值100
子线程减法结束
~~主线程结束~~

4 线程锁应用

防止多个线程之间对全局变量混乱操作,在全局变量更改的地方加线程锁,只能允许同时只有一个线程进行全局变量修改

import threading,time
from threading import Thread,Lock

def task():
    global n
    mutex.acquire()  #上锁
    time.sleep(0.1)
    n=n-1
    print("购买成功,当前余票数量%s"%n)
    mutex.release()   #解锁




n=100      #定义一个全局变量

if __name__ == '__main__':
    print('~~主线程开始~~')
    mutex = Lock()
    t_list=[]
    for i in range(10):
        t1 = Thread(target=task)
        t_list.append(t1)
        t1.start()
    for i in t_list:
        i.join()
    print('~~主线程结束~~')

执行结果:

~~主线程开始~~
购买成功,当前余票数量99
购买成功,当前余票数量98
购买成功,当前余票数量97
购买成功,当前余票数量96
购买成功,当前余票数量95
购买成功,当前余票数量94
购买成功,当前余票数量93
购买成功,当前余票数量92
购买成功,当前余票数量91
购买成功,当前余票数量90
~~主线程结束~~

5 应用队列在线程之间通讯

生产者产生产品,消费者消耗产品,用队列作为二者中间的中转仓

import threading,time,random
from threading import Thread,Lock
from  queue import Queue


#生产者类
class Producter(threading.Thread):
    def __init__(self,name,queue):
        threading.Thread.__init__(self,name=name)
        self.data=queue
    def run(self):
        for i in range(5):
            print("生产者%s将产品%s放入队列"%(self.getName(),i))
            self.data.put(i)
            time.sleep(random.random())
        print("生产者%s完成"%self.getName())
# 消费者类
class Consumer(threading.Thread):
    def __init__(self, name, queue):
        threading.Thread.__init__(self, name=name)
        self.data = queue
    def run(self):
        for i in range(5):
            value=self.data.get()    
            print("消费者%s将产品%s从队列取出"%(self.getName(),value))
            time.sleep(random.random())
        print("消费者%s完成"%self.getName())


n=100      #定义一个全局变量

if __name__ == '__main__':
    print('~~主线程开始~~')
    queue=Queue()     #实例化队列
    producter = Producter("producter",queue)
    consumer = Consumer("consumer",queue)
    producter.start()
    consumer.start()
    producter.join()
    consumer.join()

    print('~~主线程结束~~')

运行结果如下:

~~主线程开始~~
生产者producter将产品0放入队列
消费者consumer将产品0从队列取出
生产者producter将产品1放入队列
消费者consumer将产品1从队列取出
生产者producter将产品2放入队列
消费者consumer将产品2从队列取出
生产者producter将产品3放入队列
生产者producter将产品4放入队列
消费者consumer将产品3从队列取出
消费者consumer将产品4从队列取出
生产者producter完成
消费者consumer完成
~~主线程结束~~
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值