多线程代码讲解

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
发现改变了  以为同一进程内的线程之间空间共享
'''
名称空间
原文地址:https://www.cnblogs.com/lazyball/p/7476263.html