线程

# #from multiprocessing import Process
# from threading import Thread
# import time
# def task(name):
#     print('%s is running'%name)
#     time.sleep(3)
# if __name__ == '__main__':
#     t=Thread(target=task,args=('egon',))
#     #t=Process(target=task, args=('egon',))
#     t.start()
#     print('主线程')
#主线程代码运行完不能死 等啊。其他线程运行了在死 有可能会用到主线程里面东西
#方式2
from multiprocessing import Process
from threading import Thread
import time
class My(Thread):
    def run(self):
        print('%s is runninf'%self.name)
        time.sleep(3)

if __name__ == '__main__':
    t=My()
    t.start()
    print('主线程')

#看一看是不是在一个线程里面
from threading import Thread
import time ,os
def task():
    print('%s is running'%os.getpid())
    time.sleep(3)

if __name__ == '__main__':
    t=Thread(target=task,)
    t.start()
    print('主线程',os.getpid())

进程之间是互相隔离的,不共享。需要借助第三方来完成共享(借助队列,管道,共享数据)

from threading import Thread
import time,os
x=1000
def task():
    global x
    x=0

if __name__ == '__main__':
    t=Thread(target=task,)
    t.start()
    t.join()
    print('主线程',x)

Thread实例对象的方法
  # isAlive(): 返回线程是否活动的。
  # getName(): 返回线程名。
  # setName(): 设置线程名。

threading模块提供的一些方法:
  # threading.currentThread(): 返回当前的线程变量。
  # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
from threading import Thread,current_thread,active_count,enumerate
import time,os
def task():
    print('%s is running'%current_thread().name)
    time.sleep(3)
if __name__ == '__main__':
    t1=Thread(target=task,name='第一个线程')
    t2=Thread(target=task,)
    t3=Thread(target=task,)
    t1.start()
    t2.start()
    t3.start()

    print(t1.is_alive())
    print(active_count())
    print('主线程',current_thread().name)

from threading import Thread,current_thread
import time
def task():
    print('%s is running' %current_thread().name)
    time.sleep(3)
if __name__ == '__main__':
    t1=Thread(target=task,name='第一个')
    t1.daemon=True
    t1.start()
    print('主线程')
迷惑人的例子
from threading import Thread
import time
def foo():
    print(123)
    # time.sleep(10) #如果这个等的时间大于下面等的时间,就把不打印end123了
    time.sleep(2)  #如果这个等的时间小于下面等的时间,就把end123也打印了
    print('end123')
def bar():
    print(456)
    # time.sleep(5)
    time.sleep(10)
    print('end456')
if __name__ == '__main__':
    t1 = Thread(target=foo)
    t2 = Thread(target=bar)
    t1.daemon = True #主线程运行完了守护的那个还没有干掉,
    # 主线程等非守护线程全都结束它才结束
    t1.start()
    t2.start()
    print('main---------')

from threading import current_thread,Thread,Lock
import os,time
def task():
    global n
    print('%s is running' %current_thread().getName())
    temp=n
    time.sleep(0.5)
    n=temp-1


if __name__ == '__main__':
    n=100
    lock=Lock()
    threads=[]
    start_time=time.time()
    for i in range(100):
        t=Thread(target=task)
        threads.append(t)
        t.start()
    for t in threads:
        t.join()

    stop_time=time.time()
    print('主:%s n:%s' %(stop_time-start_time,n))

'''
Thread-1 is running
Thread-2 is running
......
Thread-100 is running
主:0.5216062068939209 n:99
'''


#不加锁:未加锁部分并发执行,加锁部分串行执行,速度慢,数据安全
from threading import current_thread,Thread,Lock
import os,time
def task():
    #未加锁的代码并发运行
    time.sleep(3)
    print('%s start to run' %current_thread().getName())
    global n
    #加锁的代码串行运行
    lock.acquire()
    temp=n
    time.sleep(0.5)
    n=temp-1
    lock.release()

if __name__ == '__main__':
    n=100
    lock=Lock()
    threads=[]
    start_time=time.time()
    for i in range(100):
        t=Thread(target=task)
        threads.append(t)
        t.start()
    for t in threads:
        t.join()
    stop_time=time.time()
    print('主:%s n:%s' %(stop_time-start_time,n))

'''
Thread-1 is running
Thread-2 is running
......
Thread-100 is running
主:53.294203758239746 n:0
'''

#有的同学可能有疑问:既然加锁会让运行变成串行,那么我在start之后立即使用join,就不用加锁了啊,也是串行的效果啊
#没错:在start之后立刻使用jion,肯定会将100个任务的执行变成串行,毫无疑问,最终n的结果也肯定是0,是安全的,但问题是
#start后立即join:任务内的所有代码都是串行执行的,而加锁,只是加锁的部分即修改共享数据的部分是串行的
#单从保证数据安全方面,二者都可以实现,但很明显是加锁的效率更高.
from threading import current_thread,Thread,Lock
import os,time
def task():
    time.sleep(3)
    print('%s start to run' %current_thread().getName())
    global n
    temp=n
    time.sleep(0.5)
    n=temp-1


if __name__ == '__main__':
    n=100
    lock=Lock()
    start_time=time.time()
    for i in range(100):
        t=Thread(target=task)
        t.start()
        t.join()
    stop_time=time.time()
    print('主:%s n:%s' %(stop_time-start_time,n))

'''
100 Thread-1 start to run
101 Thread-2 start to run
102 ......
103 Thread-100 start to run
104 主:350.6937336921692 n:0 #耗时是多么的恐怖
105 '''

from threading import Thread,Lock
import time
mutex=Lock()
x=100
def task():
    global x
    mutex.acquire()
    temp=x
    time.sleep(0.1)
    x=temp-1
    mutex.release()

if __name__ == '__main__':
    start=time.time()
    t_1=[]
    for i in range(100):
        t=Thread(target=task,)
        t_1.append(t)
        t.start()
    for t in t_1:
        t.join()

    print('',x)
    print(time.time()-start)

from threading import Thread,Lock,RLock
import time

# mutexA=Lock()
# mutexB=Lock()

mutexA=mutexB=RLock()

class MyThread(Thread):
    def run(self):
        self.f1()
        self.f2()

    def f1(self):
        mutexA.acquire()
        print('%s 拿到了A锁' %self.name)

        mutexB.acquire()
        print('%s 拿到了B锁' %self.name)
        mutexB.release()

        mutexA.release()

    def f2(self):
        mutexB.acquire()
        print('%s 拿到了B锁' %self.name)
        time.sleep(0.1)

        mutexA.acquire()
        print('%s 拿到了A锁' %self.name)
        mutexA.release()

        mutexB.release()


if __name__ == '__main__':
    for i in range(10):
        t=MyThread()
        t.start()

    # t1=MyThread()
    # t1.start()
    #
    # t2=MyThread()
    # t2.start()
    #
    # t3=MyThread()
    # t3.start()
    print('')

 

posted @ 2018-04-26 23:30  嘿,  阅读(131)  评论(0编辑  收藏  举报