• 多线程学习笔记


    线程之间的依赖关系,线程锁

    #coding=utf-8
    """
    进程: 要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理,网络接口的调用等。。。
    对各种资源管理的集合 就可以成为  进程
    线程: 是操作系统最小的调度单位, 是一串指令的集合
    进程 要操作cpu , 必须要先创建一个线程  ,
    所有在同一个进程里的线程是共享同一块内存空间的
    进程与线程的区别?
    线程共享内存空间,进程的内存是独立的
    同一个进程的线程之间可以直接交流,两个进程想通信,必须通过一个中间代理来实现
    创建新线程很简单, 创建新进程需要对其父进程进行一次克隆
    一个线程可以控制和操作同一进程里的其他线程,但是进程只能操作子进程
    """
    import threading
    import time
    # def run(n):
    #     print 'it is ',n,threading.current_thread()
    #     time.sleep(5)
    #     print 'done'
    
    # t1 = threading.Thread(target = run,args=('x1',))
    # t2 = threading.Thread(target = run,args=('x1',))
    # t1.start()
    # t2.start()
    # run('x1')
    # run('x1')
    class MyThread(threading.Thread):       #继承式调用
        def __init__(self,n):
            super(MyThread,self).__init__()
            self.n = n
        def run(self):
            print 'now run is',self.n,threading.current_thread()
    
    # t1 = MyThread('x1')
    # t2 = MyThread('x2')
    # t1.start()
    # t2.start()
    # start_time = time.time()     #主线程不会等子线程执行完毕就会继续往下走,所以花费时间的值不是5S
    # t_obj = []   #储存线程实例的列表
    # for i in range(50):
    #     t1 = threading.Thread(target=run, args=('x%s'%i,))
    #     t1.setDaemon(True)  #当前线程设置为守护线程,主线程完成之后不会等待守护线程执行到什么进度直接退出。
    #     t1.start()
    #     t_obj.append(t1)
    # print '__________',threading.active_count()
    # # for i in t_obj:
    # #     i.join()                        #等待所有线程结束之后再往下继续执行
    #
    # print 'cost time is ',time.time()-start_time,threading.current_thread(),threading.active_count()  #返回当前线程,返回活跃的线程个数
    #加入 t1.join()就会等待t1执行完成后再往下走,循环的50个属于子线程,主线程不包含在内,所以当前执行的线程一共有51个
    # num = 0
    # lock = threading.Lock()                 #加入进程锁
    # def run(n):
    #     lock.acquire()             #获取锁
    #     global num
    #     num += 1
    #     #time.sleep(1)             #加入sleep就会变成串行,等待时间释放锁
    #     lock.release()             #释放锁
    #
    # t_obj = []
    # for i in range(50):
    #     t1 = threading.Thread(target=run, args=('x%s'%i,))
    #     t1.start()
    #     t_obj.append(t1)
    # for i in t_obj:
    #     i.join()
    #
    # print 'now num is ',num
    
    #递归锁
    import threading, time
    
    
    def run1():
        print("grab the first part data")
        lock.acquire()
        global num
        num += 1
        lock.release()
        return num
    
    
    def run2():
        print("grab the second part data")
        lock.acquire()
        global num2
        num2 += 1
        lock.release()
        return num2
    
    
    def run3():
        lock.acquire()
        res = run1()
        print('--------between run1 and run2-----')
        res2 = run2()
        lock.release()
        print(res, res2)
    
    
    
    
    # num, num2 = 0, 0
    # lock = threading.RLock()
    # for i in range(1):
    #     t = threading.Thread(target=run3)
    #     t.start()
    #
    # while threading.active_count() != 1:               #等待子进程结束的另一种方式
    #     print(threading.active_count())
    # else:
    #     print('---- done---')
    #     print(num, num2)
    
  • 相关阅读:
    招银网络
    MYSQL基础
    http中get和post请求的作用和区别
    设计模式
    STL浅析
    云盾态势感知系统检测到您的服务器出现了紧急安全事件:挖矿木马
    SVN服务器搭建详解--权限划分
    MySQL主主复制,mysql主从复制,MySQL+keepalived故障转移。
    Redhat7.0系统利用amoeba对mysql数据进行读写分离的操作,MySQL数据库的主从配置
    源码安装zabbix LNMP源码安装
  • 原文地址:https://www.cnblogs.com/qiangayz/p/8621011.html
Copyright © 2020-2023  润新知