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

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

    #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)
    
  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/qiangayz/p/8621011.html
Copyright © 2011-2022 走看看