Python 并发编程之 Threading 模块

网友投稿 564 2022-05-29

threading模块

multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍(官方链接)

线程的创建Threading.Thread类

创建线程的方式一:

from threading import Thread import time def sayhi(name):     time.sleep(2)     print('%s say hello' %name) if __name__ == '__main__':     t=Thread(target=sayhi,args=('egon',))     t.start()     print('主线程')

创建线程的方式2:

from threading import Thread import time class Sayhi(Thread):     def __init__(self,name):         super().__init__()         self.name=name     def run(self):         time.sleep(2)         print('%s say hello' % self.name) if __name__ == '__main__':     t = Sayhi('egon')     t.start()     print('主线程')

pid的比较:

from threading import Thread from multiprocessing import Process import os def work():     print('hello',os.getpid()) if __name__ == '__main__':     #part1:在主进程下开启多个线程,每个线程都跟主进程的pid一样     t1=Thread(target=work)     t2=Thread(target=work)     t1.start()     t2.start()     print('主线程/主进程pid',os.getpid())     #part2:开多个进程,每个进程都有不同的pid     p1=Process(target=work)     p2=Process(target=work)     p1.start()     p2.start()     print('主线程/主进程pid',os.getpid())

开启效率的较量:

from threading import Thread from multiprocessing import Process import os def work():     print('hello') if __name__ == '__main__':     #在主进程下开启线程     t=Thread(target=work)     t.start()     print('主线程/主进程')     '''     打印结果:     hello     主线程/主进程     '''     #在主进程下开启子进程     t=Process(target=work)     t.start()     print('主线程/主进程')     '''     打印结果:     主线程/主进程     hello     '''

内存数据的共享问题:

from  threading import Thread from multiprocessing import Process import os def work():     global n     n=0 if __name__ == '__main__':     # n=100     # p=Process(target=work)     # p.start()     # p.join()     # print('主',n) #毫无疑问子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100     n=1     t=Thread(target=work)     t.start()     t.join()     print('主',n) #查看结果为0,因为同一进程内的线程之间共享进程内的数据 同一进程内的线程共享该进程的数据?

server:

#_*_coding:utf-8_*_ #!/usr/bin/env python import multiprocessing import threading import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(('127.0.0.1',8080)) s.listen(5) def action(conn):     while True:         data=conn.recv(1024)         print(data)         conn.send(data.upper()) if __name__ == '__main__':     while True:         conn,addr=s.accept()         p=threading.Thread(target=action,args=(conn,))         p.start()

clent:

Python 并发编程之 Threading 模块

#_*_coding:utf-8_*_ #!/usr/bin/env python import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(('127.0.0.1',8080)) while True:     msg=input('>>: ').strip()     if not msg:continue     s.send(msg.encode('utf-8'))     data=s.recv(1024)     print(data)

Thread实例对象的方法   # isAlive(): 返回线程是否活动的。   # getName(): 返回线程名。   # setName(): 设置线程名。 threading模块提供的一些方法:   # threading.currentThread(): 返回当前的线程变量。   # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。   # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

代码示例:

from threading import Thread import threading from multiprocessing import Process import os def work():     import time     time.sleep(3)     print(threading.current_thread().getName()) if __name__ == '__main__':     #在主进程下开启线程     t=Thread(target=work)     t.start()     print(threading.current_thread().getName())     print(threading.current_thread()) #主线程     print(threading.enumerate()) #连同主线程在内有两个运行的线程     print(threading.active_count())     print('主线程/主进程')     '''     打印结果:     MainThread     <_MainThread(MainThread, started 140735268892672)>     [<_MainThread(MainThread, started 140735268892672)>, ]     主线程/主进程     Thread-1     '''

join方法:

from threading import Thread import time def sayhi(name):     time.sleep(2)     print('%s say hello' %name) if __name__ == '__main__':     t=Thread(target=sayhi,args=('egon',))     t.start()     t.join()     print('主线程')     print(t.is_alive())     '''     egon say hello     主线程     False     '''

无论是进程还是线程,都遵循:守护xx会等待主xx运行完毕后被销毁。需要强调的是:运行完毕并非终止运行

#1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕

详细解释:

#1 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收), 然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束, #2 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收, 而进程必须保证非守护线程都运行完毕后才能结束。

守护线程示例1:

from threading import Thread import time def sayhi(name):     time.sleep(2)     print('%s say hello' %name) if __name__ == '__main__':     t=Thread(target=sayhi,args=('egon',))     t.setDaemon(True) #必须在t.start()之前设置     t.start()     print('主线程')     print(t.is_alive())     '''     主线程     True     '''

守护线程示例2:

from threading import Thread import time def foo():     print(123)     time.sleep(1)     print("end123") def bar():     print(456)     time.sleep(3)     print("end456") t1=Thread(target=foo) t2=Thread(target=bar) t1.daemon=True t1.start() t2.start() print("main-------")

软件开发 人工智能 云计算 机器学习

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:LiteOS通信模组教程03-AT指令玩转NB-IoT通信
下一篇:Linux 多线程/进程通信同步: 信号量
相关文章