python 启动一个socket 如何启动一个python线程_pycharm

python中如何创建线程
python的标准库提供了两个模块:
  • thread:低级模块
  • threading:高级模块,对thread进行了封装。**
    **绝大多数情况下,我们只需要使用threading这个高级模块
启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行:

示例代码:

import threading,time
def saysorry():
    print('亲爱的,我错了')
    time.sleep(2)
if __name__=='__main__':
    for i in range(5):
        t=threading.Thread(target=saysorry)
        t.start()   #启动线程,即让线程开始执行

结果是:

  • **同时打印出了5行‘亲爱的,我错了’ **
  • **time.sleep(2) 并没有展示出相应的效果 **
  • 说明同时执行了5个saysorry函数
几个需要注意的点
  • python中,默认情况下主线执行完自己的任务以后,就推出了,此时子线程会继续执行自己的任务,
  • 直到自己的任务结束。如果需要主线程等待其他的子线程执行结束之后在终止,需要子线程调用join()函数
  • 多线程程序的执行顺序是不确定的

示例代码:

import threading,time
def sing():
    time.sleep(4)
    print('正在唱歌')
def dance():
    time.sleep(2)
    print('正在跳舞')
if __name__=='__main__':
    a1=threading.Thread(target=sing)
    a2=threading.Thread(target=dance)
    a1.start()
    a2.start()
    print('555')

结果是:

  • 先出现555,再出现‘正在跳舞’,最后出现‘正在唱歌’
  • **因为是同时执行,有了sleep函数,他就延缓了 **
  • 如果要按顺序出现 就需要join()函数了
import threading,time
def sing():
    time.sleep(4)
    print('正在唱歌')
def dance():
    time.sleep(2)
    print('正在跳舞')
if __name__=='__main__':
    a1=threading.Thread(target=sing)
    a2=threading.Thread(target=dance)
    a1.start()
    a1.join()
    a2.start()
    a2.join()
    print('555')

这样的结果就是:

正在唱歌
正在跳舞
555
多线程-共享全局变量
多线程之间共享全局变量有2种方式:
  • 子线程函数使用global关键字来调用函数外全局变量
  • 列表当作实参传递到线程中

在一个进程内的所有线程共享全局变量

  • 优点:
  • 很方便在多个线程间共享数据
  • 缺点:
  • 线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)
共享全局变量-global全局变量
from threading import Thread
import time
q=100
def work1():
    global q
    for i in range(3):
        q+=1
    print('经过work1,q的值为%d'%q)
def work2():
    global q
    for i in range(2):
        q+=1
    print('经过work2,q的值为%d'%q)
a=Thread(target=work1)
s=Thread(target=work2)
a.start()
a.join()
s.start()
s.join()
print(q)

结果为:

经过work1,q的值为103
经过work2,q的值为105
105
共享全局变量-列表当实参 传列表是全局变量 不用声明
from threading import Thread
def work1(a):
    a.append(4)
    print('经过work1,列表为%s'%a)
def work2(a):
    a.append(5)
    print('经过work2,列表为%s'%a)
w=[1,2,3]
q=Thread(target=work1,args=(w,))
s=Thread(target=work2,args=(w,))
q.start()
s.start()
print(w)

结果为:

经过work1,列表为[1, 2, 3, 4]
经过work2,列表为[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
import threading,time
def a1(num):
    global add
    add+=num
    print(add)
def a2(num):
    global add
    add+=num
    print(add)
add=0
q1=threading.Thread(target=a1,args=(3,))
q2=threading.Thread(target=a2,args=(4,))
q1.start()
print('===============')
q2.start()
print('最终结果为:%d'%add)

结果为:

3
===============
7
最终结果为:7
查看有几个线程
import threading
print(threading.current_thread())
print(threading.enumerate())
###查看有几个线程
print(len(threading.enumerate())