爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 14502|回复: 2

[源代码] python之线程模块threading

[复制链接]

新浪微博达人勋

发表于 2021-1-5 16:22:14 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
一、多线程的基本操作

python多线程模块threading,用法与多进程multiProcessing几乎一样!
对照参考:Python之进程的学习

import threading

def f(n):
    print('线程名:',threading.current_thread().name,[1]*n)

if __name__=='__main__':
    #新建3个线程:
    thread1=threading.Thread(target=f,args=(2,),name='firstThread')
    thread2=threading.Thread(target=f,args=(4,))
    thread3=threading.Thread(target=f,args=(6,))
   
    thread1.start()
    thread2.start()
    thread3.start()
   
    thread1.join()
    thread2.join()
    thread3.join()


#结果:
# 线程名: firstThread [1, 1]
# 线程名: Thread-1 [1, 1, 1, 1]
# 线程名: Thread-2 [1, 1, 1, 1, 1, 1]

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2021-1-5 16:34:16 | 显示全部楼层
二、线程间共享数据:可以通过全局变量


import threading


global y
y=0


def f(n):
    global y
    y=y+n
    print('线程名:',threading.current_thread().name,y)
   
if __name__=='__main__':
    #新建3个线程:
    thread1=threading.Thread(target=f,args=(1,),name='firstThread')
    thread2=threading.Thread(target=f,args=(10,))
    thread3=threading.Thread(target=f,args=(100,))
   
    thread1.start()
    thread2.start()
    thread3.start()
   
    thread1.join()
    thread2.join()
    thread3.join()



结果:


线程名: firstThread 1
线程名: Thread-1 11
线程名: Thread-2 111


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-1-5 17:30:07 | 显示全部楼层
本帖最后由 15195775117 于 2021-1-5 17:31 编辑

三、互斥锁

不同进程的内存空间是独立的,通信麻烦
不同线程共享内存空间,通信方便,但也导致同步困难:
不同线程同时操作同一内存会导致错误,所以有了“互斥锁”:
一个线程使用某块内存时,会锁上,使用完就释放

import threading,time

global y
y=0

def f1(n):
    global y
    for i in range(9):
        time.sleep(0.5)
        y=y+1
        print('线程'+str(n),'y=',y)

def f2(n):
    global y
    for i in range(9):
        time.sleep(0.5)
        y=y+10
        print('线程'+str(n),'y=',y)

def f3(n):
    global y
    for i in range(9):
        time.sleep(0.5)
        y=y+100
        print('线程'+str(n),'y=',y)

if __name__=='__main__':
    #新建3个线程:
    thread1=threading.Thread(target=f1,args=(1,),name='firstThread')
    thread2=threading.Thread(target=f2,args=(2,))
    thread3=threading.Thread(target=f3,args=(3,))
   
    thread1.start()
    thread2.start()
    thread3.start()
   
#输出:
# 线程3 y= 100
# 线程1 y= 101
# 线程2 y= 111
# 线程3 y= 211
# 线程2 y= 221
# 线程1 y= 222
# 线程3 y= 322
# 线程1 y= 323
# 线程2 y= 333
# 线程3 y= 433
# 线程1 y= 434
# 线程2 y= 444
# 线程3 y= 544
# 线程1 y= 545
# 线程2 y= 555
# 线程3 y= 655
# 线程1 y= 656
# 线程2 y= 666
# 线程3 y= 766
# 线程1 y= 767
# 线程2 y= 777
# 线程3 y= 877
# 线程1 y= 878
# 线程2 y= 888
# 线程3 y= 988
# 线程1 y= 989
# 线程2 y= 999

我的疑问:
互斥锁好像是自动的,莫非不需要手动设置?


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表