多线程代码讲解

Posted Lazyball

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程代码讲解相关的知识,希望对你有一定的参考价值。

threading模块介绍

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

官网链接:https://docs.python.org/3/library/threading.html?highlight=threading#

开启多线程的两种方法

方法1: 常用

from threading import Thread

def task():
    print(is running)
if __name__==__main__:
    t=Thread(target=task,)
    t.start() #开启线程的开销小,速度快 线程开启在进程里,基于当前进程的空间中开启线程
    print()
‘‘‘
开启一个线程的打印结果: 依次打印
is running
主
‘‘‘

from multiprocessing import Process

def task():
    print(is ruuing)
if __name__==__main__:
    p=Process(target=task,)
    p.start()#开启进程的开销大,速度慢,发送开启进程的指令给系统后,系统需要调用资源开启,需要时间,这时print打印操作已经执行
    print()
‘‘‘
开启进程的打印结果:
主
is ruuing
‘‘‘

方法2:  不常用,也有人这么用

from threading import Thread
class Mythread(Thread):
    def run(self):
        print(is running)

if __name__==__main__:
    t=Mythread()
    t.start()
    print()
‘‘‘
is running
主
‘‘‘

在一个进程下开启多个线程与在一个进程下开启多个子进程的区别

技术分享
from threading import Thread
class Mythread(Thread):
    def run(self):
        print(is running)

if __name__==__main__:
    t=Mythread()
    t.start()
    print()
‘‘‘
is running
主
‘‘‘


from threading import Thread
from multiprocessing import Process
import os

def task():
    print(%s is running %os.getpid())

if __name__==__main__:
    t1=Thread(target=task,)
    t2 = Thread(target=task, )
    t1.start()
    t2.start()
    print(,os.getpid())
‘‘‘
#都是在同一个进程中
1884 is running
1884 is running
主 1884
‘‘‘


from threading import Thread
from multiprocessing import Process
import os

def task():
    print(%s is running %os.getpid())

if __name__==__main__:
    p1=Process(target=task,)
    p2 = Process(target=task, )
    p1.start()
    p2.start()
    print(,os.getpid())

‘‘‘
#主进程id和两个子进程id
主 7816
6452 is running
8436 is running
‘‘‘
pid
技术分享
from threading import Thread
from multiprocessing import Process

n=100
def work():
    global n
    n=0

if __name__==__main__:
    p=Process(target=work,)
    p.start()
    p.join()
    print(,n)
‘‘‘
主 100
发现n并没有被修改  因为主进程是这个程序就run
这个文件,子进程是p,只进程和子进程空间上完全独立
创建子进程p的时候,子进程拷贝父进程的状态,里边也包括
n=100,然后global n=0 修改的是子进程的全局变量,
打印的n是父进程的全局变量,所以没有变

‘‘‘

from threading import Thread
from multiprocessing import Process

n=100
def work():
    global n
    n=0

if __name__==__main__:
    t=Thread(target=work,)
    t.start()
    print(,n)
‘‘‘
主 0
发现改变了  以为同一进程内的线程之间空间共享
‘‘‘
名称空间

 

以上是关于多线程代码讲解的主要内容,如果未能解决你的问题,请参考以下文章

多个用户访问同一段代码

多线程之synchronized讲解

第三章--Win32程序的执行单元(部分概念及代码讲解)(上 -- 多线程)

详细讲解 —— 多线程初阶认识线程(Java EE初阶)

多个请求是多线程吗

java多线程实力讲解