• Python Threading


    Forking and Threading:

        线程:

            是操作系统能够进行运算调度的最小单位,是进程中的实际运作单位,

            一条线程指进程中一个单一顺序的控制流,一个进程可以并发多个线程。

        进程:

            程序并不能单独运行,只有在将程序装载到内存中,系统为他分配资源才能运行,

            而这种执行的程序被称之为进程。

       

        执行多线程的两种方法;

            1.直接调用

            import threading

            import time

            def myThreading(num):

                print('running on number:%s'%num)

                time.sleep(3)

                print('end number:%s'%num)

            if __name__ == '__main__':

                t1 = threading.Thread(target=myThreading,args=(1,))

                t2 = threading.Thread(target=myThreading,args=(2,))

                t1.start()

                t2.start()

            --------------------------

            2.类实例式调用:

            import threading

            import time

            class MyThreading(threading.Thread):

                def __init__(self,num):

                    self.num = num

                    threading.Thread.__init__(self)

                def run(self):

                    print('running on number:%s'%self.num)

                    time.sleep(self.num)

                    print('end number:%s'%self.num)

            if __name__ == '__main__':

                t1 = MyThreading(1)

                t2 = MyThreading(2)

                t1.start()

                t2.start()

               

            3.join() and setDaemon(Ture)

                t1.join()

                    在t1子进程结束后,该父进程才结束

                t1.setDaemon(Ture)

                    将线程声明为收获线程,必须在start()之前设置,在主线程结束后,

                    该设置的子线程一起结束,不管是否执行完毕。

                   

            4.Thread的其他方法:

                threading.currentThread() #返回当前的线程变量

                threading.enumerate() #返回一个包含正在运行的线程的list。

                threading.activeCount() #返回正在运行的线程数 = len(threading.enumerate())

                t1.run() #用于表示线程活动的方法

                t1.start() #开启线程

                t1.join()  #阻塞主进程

                t1.setDaemon() #守护线程

                t1.isAlive() #返回线程是否活动

                t1.getName() #获取线程名

                t1.setName() #设置线程名

               

        多线程锁:

            同步锁:

                保证数据的唯一性,在同一时刻只有一个线程操作数据。

                #获取一个锁 ----lock = threading.Lock()

                #对操作加锁 ----lock.acquire()

                #结束释放锁 ----lock.release()

                import threading

                import time

                def addNum():

                    global num

                    lock.acquire()

                    temp=num

                    print('get num:---',num)

                    time.sleep(0.1)

                    num = temp - 1

                    lock.release()

                num = 100

                thread_list = []

                lock = threading.Lock()

                for i in range(100):

                    t = threading.Thread(target=addNum)

                    t.start()

                    thread_list.append(t)

                for t in thread_list:

                    t.join()

                print('final num:',num)

               

                GIL:

                    pass

                   

            线程死锁,递归锁:

                lockA = threading.Lock()

                lockB = threading.Lock()

                同时使用多把锁,并且嵌套使用的时候就会出现死锁的现象,解决死锁使用递归锁。

                lock = threading.RLock()

                    lock.acquire()

                    lock.acquire()

                    lock.release()

                    lock.release()

                RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次acquire,

                直到一个线程的所有的acquire都被release,其他的线程才能获得资源。

               

  • 相关阅读:
    脱壳->模拟追踪脱壳法原理
    脱壳->内存断点法脱壳
    奇技淫巧技术-注册表的操作
    LoardPe与Import REC X64dbg脚本 脱壳 Upx
    VS快捷键一览表.常用快捷键整理.
    VS2019库头文件的使用
    PowerShell第一讲,别名,变量,命令。
    Debug技巧-启动调试附加原理
    strlen的另一种实现,可以作为ShellCode
    windows-遍历另一进程内存根据进程PID
  • 原文地址:https://www.cnblogs.com/mihon/p/8980780.html
Copyright © 2020-2023  润新知