linux编程-多线程

多线程

python主要是通过thread和threading这两个模块来实现多线程支持。python的thread模块是比较底层的模块,python的threading模块是对thread做了一些封装,可以更加方便的被使用。但是python由于GIL(global interpreter lock 全局解释锁)的存在无法使用threading充分利用CPU资源,GIL使得python同一个时刻只有一个线程在一个cpu上执行字节码,并且无法将多个线程映射到多个cpu上,即不能发挥多个cpu的优势。即多线程只能在一个CPU上执行,CPU是按照时间片轮询的方式来执行子线程的。

创建一个线程

第一种形式
from threading import Thread
import time
def test():
    print("---我爱你,老婆----")
    time.sleep(1)
for i in range(5):  #父线程等子线程
    t=Thread(target=test) #主线程创建5个子线程完成任务
    t.start(

创建一个线程需要一个库 threading库,使用该库中的 Thread创建一个线程,

第二种形式
import threading
import time
class M(threading.Thread):
    def run(self):
        for i in range(10):
            time.sleep(1)
            msg="I`m"+self.name+"@"+str(i)
            print(msg)
def test():
    for i in range(5):
        t = M()
        t.start()
if __name__=="__main__":
   test()

我么可以设置一个类,直接继承该库中的Thread模块,重新写父类方法中的run发放
这也是一种创建线程的形式

线程中的传参与数据共享

from threading import Thread
import time
def work1(nums):
    nums.append(44)
    print("----in work1---",nums)
def work2(nums):
    #延时一会,保证t1线程中的事情做完
    time.sleep(1)
    print("----in work2---",nums)
g_nums = [11,22,33]
t1 = Thread(target=work1, args=(g_nums,))
t1.start()
t2 = Thread(target=work2, args=(g_nums,))
t2.start()

线程传递参数使用args传递,传递的参数如果是一个的话就要以元组传递,

避免多线程对共享数据出错的方式

from threading import Thread
g_num = 0
g_flag = 1
def test1():
    global g_num
    global g_flag
    if g_flag == 1:
        for i in range(1000000):
            g_num += 1
        g_flag = 0
    print("---test1---g_num=%d"%g_num)
def test2():
    global g_num
    #轮询
    while True:
        if g_flag != 1:
            for i in range(1000000):
                g_num += 1
            break
    print("---test2---g_num=%d"%g_num)
p1 = Thread(target=test1)
p1.start()
p2 = Thread(target=test2)
p2.start()
print("---g_num=%d---"%g_num)

多线程共享数据可能会混乱,可以使用轮询的方式控制线程的进行,从而使线程之间数据的准确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值