多线程代码讲解

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
发现改变了  以为同一进程内的线程之间空间共享
‘‘‘

名称空间

时间: 2024-08-14 15:05:36

多线程代码讲解的相关文章

Eclipse调试多线程代码

Eclipse调试多线程代码 标签: eclipse 调试 多线程 | 发表时间:2013-02-16 05:51 | 作者:czjuttsw 分享到: 出处:http://blog.csdn.net 相信到现在为止,不管是什么编程语言,程序员都使用了IDE,IDE简化了程序员的开发过程.IDE能够管理项目,自动生成代码,自动生成文档,以及调试应用程序. 默认情况下,在调试多线程程序时,当遇到断点时(breakpoint),当前线程暂停,而其它线程继续运行,这是我们不想要看到的.比如下面的例子:

Java多线程例子讲解

一:知识点声明: 1.区别进程和线程:进程是静态概念,它的执行依赖线程进行. 2.进程的状态:就绪(等待cpu执行),运行,中止,阻塞(等待所需资源,进入阻塞态) 3.Java程序的main函数即是一个线程,被称做主线程.此时如果新建线程,则和主线程一起并行运行. 4.Java中的构造方法.main函数谁先执行? main函数先执行,因为main是静态方法,程序一开始就执行:而构造方法只有在类实例化时才去调用. 二:实例程序 public class GetCurrentThread imple

代码讲解Android Scroller、VelocityTracker

在编写自定义滑动控件时常常会用到Android触摸机制和Scroller及VelocityTracker.Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程对Android触摸机制需要用到的函数进行了详细的解释,本文主要介绍两个重要的类:Scroller及VelocityTracker.利用上述知识,最后给出了一个自定义滑动控件的demo,该demo类似于ImageGallery.ImageGallery一般是用Gri

编写多线程代码时,启动线程后等待线程结束方法

在编写多线程代码时,如果主线程结束,那么子线程也会随之结束,如何等待线程结束再往下执行.   等待线程执行完成代码.   线程代码:   package demo; import java.util.concurrent.CountDownLatch; public class NodeSqlThread1 implements Runnable{         private CountDownLatch cdlSync;         public NodeSqlThread1(Coun

『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法&代码讲解+资源打包下载】

一,什么是TicTacToe(井字棋) 本游戏为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿童欢迎.可能我说了半天,对它名字不熟悉的朋友也不懂我在说神马.那没关系,我就引用Wiki(维基百科)的介绍作为大家对它名字的认识,顺便也勾起我们儿时的回忆: 井字棋,大陆.台湾又称为井字游戏.圈圈叉叉:另外也有打井游戏.OX棋的称呼,香港多称井字过三关.过三关,是种纸笔游戏.两个玩家,一个打圈(O),一个打

CUDA学习,第一个kernel函数及代码讲解

前一篇CUDA学习,我们已经完成了编程环境的配置,现在我们继续深入去了解CUDA编程.本博文分为三个部分,第一部分给出一个代码示例,第二部分对代码进行讲解,第三部分根据这个例子介绍如何部署和发起一个kernel函数. 一.代码示例 二.代码解说 申明一个函数,用于检测CUDA运行中是否出错. kernel函数,blockIdx.x表示block在x方向的索引号,blockDim.x表示block在x方向的维度,threadIdx.x表示thread在x方向的索引号. 这里也许你会问,为什么在x方

机器学习实战(代码讲解)

机器学习实战 http://www.cnblogs.com/qwertWZ/p/4582096.html 机器学习实战笔记:http://blog.csdn.net/Lu597203933/article/details/37969799 #第一个kNN分类器 inX-测试数据 dataSet-样本数据 labels-标签 k-邻近的k个样本 def classify0(inX,dataSet, labels, k): #计算距离 dataSetSize = dataSet.shape[0] d

第二章--Win32程序运行原理 (部分概念及代码讲解)

学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不能被该线程访问. PS:进程A在其地址空间的0x12345678地址处能够有一个数据结构,而进程B能够在其地址空间的0x12345678处存储一个完全不同的数据.彼此不能访问. 2. 在大多数系统中,Windows将地址空间的一半(4GB的前一半,0x00000000-0x7FFFFFFF)留给进程作为私有存

多线程代码

// NSObject // 在子线程中执行代码 // 参数1: 执行的方法 (最多有一个参数,没有返回值) // 参数2: 传递给方法的参数 //    [self performSelectorInBackground:@selector(cycling:) withObject:@"obj1"]; // 回到主线程更新页面 //    [self performSelectorOnMainThread:@selector(updateUI:) withObject:nil wai