Python----线程

threading模块:

1、创建一个线程:

target:后面加目标函数名 ,不加括号。name是线程名字,args是传递的参数,多加一个逗号。

import threading
import time

def listen(x):
    print("{}begin listen {}".format(x,time.ctime()))
    time.sleep(3)
    print("end listen {}".format(time.ctime()))

def game():
    print("begin game {}".format(time.ctime()))
    time.sleep(5)
    print("end game {}".format(time.ctime()))

if __name__ == '__main__':
    t1 = threading.Thread(target=listen,args=('Jax',),name='2333')
    t2 = threading.Thread(target=game)
    t1.start()
    t2.start()
    # 主进程
    print("--------")

>>> Jaxbegin listen Sat Nov 24 12:26:25 2018
>>> begin game Sat Nov 24 12:26:25 2018
>>> --------
>>> end listen Sat Nov 24 12:26:28 2018
>>> end game Sat Nov 24 12:26:30 2018

此时 t1和 t2 都是实例的对象。并没有真正的运行。print函数也是一个进程,相当于本程序有三个进程,一个主进程,两个子进程。三个同时运行,所以输出语句也会最先被打印出来。

--------------------------------------------------------------萌萌哒的分割线--------------------------------------------------------------------------------------------------

start()方法:线程开始执行,激活线程,处于就绪态。      join():等待当前线程执行完毕,阻塞线程,才会继续向下执行。

import threading
import time

def listen(x):
    print("{} begin listen {}".format(x,time.ctime()))
    time.sleep(3)
    print("end listen {}".format(time.ctime()))

def game():
    print("begin game {}".format(time.ctime()))
    time.sleep(5)
    print("end game {}".format(time.ctime()))

if __name__ == '__main__':
    t1 = threading.Thread(target=listen,args=('Jax',),name='2333')
    t2 = threading.Thread(target=game)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    # 主进程
    print("--------")

>>> Jaxbegin listen Sat Nov 24 12:25:20 2018
>>> begin game Sat Nov 24 12:25:20 2018
>>> end listen Sat Nov 24 12:25:23 2018
>>> end game Sat Nov 24 12:25:25 2018
>>> --------

还可以通过一个循环来实例线程:

import threading
import time

def listen(x):
    print("{}begin listen {}".format(x,time.ctime()))
    time.sleep(3)
    print("end listen {}".format(time.ctime()))

def game():
    print("begin game {}".format(time.ctime()))
    time.sleep(5)
    print("end game {}".format(time.ctime()))


thread = []
t1 = threading.Thread(target=listen,args=('Jax',),name='2333')
t2 = threading.Thread(target=game)
thread.append(t1)
thread.append(t2)
if __name__ == '__main__':
    for t in thread:
        t.start()
        t.join()
    t.join()  #  此时相当于join t2
    # 主进程
    print("--------")

将创建的进程加入列表,通过遍历列表实例一个线程。

守护线程:子线程和主线程一同退出。当主线程退出时一同退出,不管子线程是否结束。如果有其中一个子线程没有设置相当于主线程仍然没有完,仍然会等待子线程结束。

t.setDaemon(true)  设置当前线程为守护进程。必须在该线程的start方法前设置。也可以通过t.daemon = True来设置守护线程。

import threading
import time

def listen(x):
    print("{}begin listen {}".format(x,time.ctime()))
    time.sleep(3)
    print("end listen {}".format(time.ctime()))

def game():
    print("begin game {}".format(time.ctime()))
    time.sleep(5)
    print("end game {}".format(time.ctime()))

thread = []
t1 = threading.Thread(target=listen,args=('Jax',),name='2333')
t2 = threading.Thread(target=game)
thread.append(t1)
thread.append(t2)
if __name__ == '__main__':
    for t in thread:
        t.setDaemon(True)
        t.start()
    # 主进程
    print("--------")

>>> Jaxbegin listen Sat Nov 24 12:46:20 2018
>>> begin game Sat Nov 24 12:46:20 2018
>>> --------

当主线程退出时只会查看不是守护线程的线程,如果需要等待就等待,守护线程随主线程一起结束。在等待不是守护线程的过程相当于主线程没有结束,守护线程的那些线程仍会继续向下执行。主线程只会等待不是守护线程的线程,不会等待守护线程。守护亦可理解为跟随,跟随主线程一同退出。

当运行时间短的线程为守护线程时:

import threading
import time

def listen(x):
    print("{}begin listen {}".format(x,time.ctime()))
    time.sleep(3)
    print("end listen {}".format(time.ctime()))

def game():
    print("begin game {}".format(time.ctime()))
    time.sleep(5)
    print("end game {}".format(time.ctime()))

thread = []
t1 = threading.Thread(target=listen,args=('Jax',),name='first thread')
t2 = threading.Thread(target=game)
thread.append(t1)
thread.append(t2)
if __name__ == '__main__':
    t2.setDaemon(True)
    for t in thread:
        t.start()
    print("--------")

>>> Jaxbegin listen Sat Nov 24 13:15:26 2018
>>> begin game Sat Nov 24 13:15:26 2018
>>> --------
>>> end listen Sat Nov 24 13:15:29 2018

:主线程并没有的等待守护线程结束,而是等待不是守护线程结束后退出。

其他方法:

isalive() 线程是否存活.。 getName()   获得线程名。  setName()    修改线程名。trun(): 用以表示线程活动的方法。start在t.run前面。

线程被调度后自动执行run方法。

threading.currentThread(): 返回当前的线程变量。 threading.active_count(): 有几个线程在活动。可以使当前线程为一的时候运行主线程。

import threading
import time

def listen(x):
    print("{}begin listen {}".format(x,time.ctime()))
    time.sleep(3)
    print("end listen {}".format(time.ctime()))

def game():
    print("begin game {}".format(time.ctime()))
    time.sleep(5)
    print("end game {}".format(time.ctime()))


thread = []
t1 = threading.Thread(target=listen,args=('Jax',),name='first thread')
t2 = threading.Thread(target=game)
thread.append(t1)
thread.append(t2)
if __name__ == '__main__':
    for t in thread:
        t.setDaemon(True)
        t.start()
        print(t.getName())
        print(threading.current_thread())
        print(t.is_alive())
    print(threading.active_count())
    # 主进程
    print("--------")


>>> Jaxbegin listen Sat Nov 24 13:03:39 2018
>>> first thread
>>> <_MainThread(MainThread, started 1416)>
>>> True
>>> begin game Sat Nov 24 13:03:39 2018
>>> Thread-1
>>> <_MainThread(MainThread, started 1416)>
>>> True
>>> 3
>>> --------

另外的一个创建线程的方式:

import threading

class MyThread(threading.Thread):
    def __init__(self,num):
        super().__init__()
        self.num = num
    def run(self):
    // 此方法需要被重写,start方法执行run方法。
        print("+++++++++")
        print("线程{}".format(self.num))
if __name__ == '__main__':
    t1 = MyThread(1)
    t2 = MyThread(2)
    t1.start()
    t2.start()
    print("-----------")

>>> +++++++++
>>> 线程1
>>> +++++++++
>>> 线程2
>>> -----------

并不推荐这样的方法,是因为封闭性太强,推荐前面的方法。

:多个线程共享内存。线程不能独立存在。线程最小执行单元。线程是进程的一个实体。一个线程可以创建一个线程,也可以撤销一个线程。

猜你喜欢

转载自blog.csdn.net/weixin_41678001/article/details/84433475
今日推荐