35 线程

1、关于线程

  1.什么是线程

    进程:资源单位
    线程:执行单位
    注意:每一个进程中都会自带一个线程
  2.为什么要有线程
    开一个进程:
      申请内存空间 耗时
      将代码拷贝到申请的内存空间中 耗时

    开线程:
      不需要申请内存空间

    开线程的开销远远小于开进程的开销!!!
  3.如何使用线程

2、开启线程的两种方式
  方式一
from threading import Thread
import time
import random


def task(name):
    print('%s is running ' % name)
    time.sleep(random.random())
    print('%s is over' % name)


if __name__ == '__main__':
    t = Thread(target=task, args=('Tom',))
    t.start() # 开启线程的速度非常快,几乎代码执行完线程就已经开启
    print('')


>>>:
    Tom is running 
    主
    Tom is over
  方式二
from threading import Thread
import time
import random


class MyThread(Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print('%s is running' % self.name)
        time.sleep(random.random())
        print('%s is end' % self.name)


if __name__ == '__main__':
    p = MyThread('json')
    p.start()
    print('')


>>>:
    json is running
    主
    json is end
3、线程之间的数据共享
from threading import Thread

x = 100


def task():
    global x
    x = 666


t = Thread(target=task)
t.start()
t.join()
print(x)


>>>:
    666
4、线程互斥锁
from threading import Thread, Lock
import time
import random

mutex = Lock()
n = 100


def task():
    global n
    mutex.acquire()
    tmp = n
    time.sleep(random.random())
    n = tmp - 1
    mutex.release()


t_list = []
for i in range(100):
    t = Thread(target=task)
    t.start()
    t_list.append(t)

for t in t_list:
    t.join()


print(n)   # 0
5、线程对象的其他属性和方法
  
获取线程id:os.getpid()
  
获取线程名:current_thread().name current_thread().getName()
  当前存活线程数:active_count()
from threading import Thread, active_count, current_thread
import os
import time


def task(name):
    print('%s is running'%name,os.getpid())
    print('%s is running' % name, current_thread().name
    time.sleep(1)
    print('%s is over' % name)


def info(name):
    print('%s is running' % name, current_thread().name
    time.sleep(1)
    print('%s is over' % name)


t = Thread(target=task, args=('Tom',))
t1 = Thread(target=info, args=('Bob',))
t.start()
t1.start()
t.join()
print(active_count())  # 当前存活的线程数
print(os.getpid())
print(current_thread().name)>>>:
Tom is running 18220
Tom is running Thread-1
Bob is running Thread-2
Bob is over
Tom is over
1
18220
MainThread
6、守护线程
from threading import Thread
import time


def task(name):
    print('%s is running' % name)
    time.sleep(1)
    print('%s is over' % name)


if __name__ == '__main__':
    t = Thread(target=task, args=('Tom',))
    t.daemon = True
    t.start()
    print('')


>>>:
    Tom is running
    主

猜你喜欢

转载自www.cnblogs.com/zhouyongv5/p/10827887.html
35