zoukankan      html  css  js  c++  java
  • Python学习笔记23:多线程

    import time
    import threading
    loop = [4, 2]
    class ThreadFunc:
    def __init__(self, name):
    self.name = name
    def loop(self, nloop, nsec):
    #nloop:loop函数的名称
    #nsec:系统休眠时间
    print('Start loop', nloop, 'at', time.ctime())
    sleep(nsec)
    print('Done loop', nloop, 'at', time.ctime())
    def main():
    print("starting at:", time.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.start()
    t2.start()

    t1.join()
    t2.join()

    print('all done at:', time.ctime())

    if __name__ == '__main__':
    main()



    threading的使用:
    -直接利用threading.Thread生成Thread实例
    1.t = threading.Thread(target = xxx, args = (xxx,))
    2.t.start(): 启动多线程
    3.t.join():等待多线程执行完成
    守护线程:
    -如果在程序中将子线程设置为守护线程,则子线程会在主线程结束的时候自动退出
    -一般认为,守护线程不重要或者不允许离开主线程独立运行

    线程常用属性:
    -threading.currentThread: 返回当前线程变量
    -threading.enumerate: 返回一个包含正在运行的线程的list,正在运行的线程指的是线程启动后,结束前的
    -threading。activeCount:返回正在运行的线程数量,效果跟len(threading.enumerate)相同
    -thr.setName: 给线程设置名字
    -thr.getName:得到线程的名字

    共享变量:当多个线程同时访问一个变量的时候,会产生共享变量的问题

    import threading
    sum = 0
    loopSum = 100000
    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('start.....{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))


    锁:哪个资源需要多个线程,就锁谁

    import threading
    sum = 0
    loopSum = 100000
    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))






    锁:哪个资源需要多个线程,就锁谁


    可重入锁:可以被一个线程多次申请







  • 相关阅读:
    tensorflow2.0 GPU和CPU 时间对比
    第一次使用FileZilla Server
    PremiumSoft Navicat 15 for Oracle中文破解版安装教程
    Unmapped Spring configuration files found. Please configure Spring facet or use 'Create Default Context' to add one including all unmapped files.
    ng : 无法加载文件 D: odejs ode_global g.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
    angular
    Github上优秀的go项目
    win10---file explore 中remove quick access folder
    react--useEffect使用
    linux---cat 和 grep 的妙用
  • 原文地址:https://www.cnblogs.com/chickenwrap/p/10171561.html
Copyright © 2011-2022 走看看