多线程和多进程的区别(小结 转载)

Python:Multiprocessing跑满多核——一种分配任务的写作模板 在11400h的测试中,多核拉满的速度为单开的6.22倍(实际上这也就是六核处理器),长时间跑任务降频后仍有4.87倍,充分利用了多核的性能,加速了日常的计算。 阅读详情

地址:http://blog.youkuaiyun.com/hairetz/archive/2009/06/19/4281931.aspx

很想写点关于多进程和多线程的东西,我确实很爱他们。但是每每想动手写点关于他们的东西,却总是求全心理作祟,始终动不了手。

今天终于下了决心,写点东西,以后可以再修修补补也无妨。

 

一.为何需要多进程(或者多线程),为何需要并发?

这个问题或许本身都不是个问题。但是对于没有接触过多进程编程的朋友来说,他们确实无法感受到并发的魅力以及必要性。

我想,只要你不是整天都写那种int main()到底的代码的人,那么或多或少你会遇到代码响应不够用的情况,也应该有尝过并发编程的甜头。就像一个快餐点的服务员,既要在前台接待客户点餐,又要接电话送外卖,没有分身术肯定会忙得你焦头烂额的。幸运的是确实有这么一种技术,让你可以像孙悟空一样分身,灵魂出窍,乐哉乐哉地轻松应付一切状况,这就是多进程/线程技术。

并发技术,就是可以让你在同一时间同时执行多条任务的技术。你的代码将不仅仅是从上到下,从左到右这样规规矩矩的一条线执行。你可以一条线在main函数里跟你的客户交流,另一条线,你早就把你外卖送到了其他客户的手里。

 

所以,为何需要并发?因为我们需要更强大的功能,提供更多的服务,所以并发,必不可少。

 

二.多进程

什么是进程。最直观的就是一个个pid,官方的说法就:进程是程序在计算机上的一次执行活动。

说得简单点,下面这段代码执行的时候

 

+ expand sourceview plaincopy to clipboardprint?
int main()  
 
{  
 
printf(”pid is %d/n”,getpid() );  
 
return 0;  
 
} 
int main()

{

printf(”pid is %d/n”,getpid() );

return 0;

}
 

进入main函数,这就是一个进程,进程pid会打印出来,然后运行到return,该函数就退出,然后由于该函数是该进程的唯一的一次执行,所以return后,该进程也会退出。

 

看看多进程。linux下创建子进程的调用是fork();

 

+ expand sourceview plaincopy to clipboardprint?
#include <unistd.h>  
#include <sys/types.h>   
#include <stdio.h>  
 
   
 
void print_exit()  
{  
       printf("the exit pid:%d/n",getpid() );  
}  
 
main ()   
{   
   pid_t pid;   
   atexit( print_exit );      //注册该进程退出时的回调函数  
      pid=fork();   
        if (pid < 0)   
                printf("error in fork!");   
        else if (pid == 0)   
                printf("i am the child process, my process id is %d/n",getpid());   
        else   
        {  
               printf("i am the parent process, my process id is %d/n",getpid());   
              sleep(2);  
              wait();  
       }  
 
} 
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>

 

void print_exit()
{
       printf("the exit pid:%d/n",getpid() );
}

main ()
{
   pid_t pid;
   atexit( print_exit );      //注册该进程退出时的回调函数
      pid=fork();
        if (pid < 0)
                printf("error in fork!");
        else if (pid == 0)
                printf("i am the child process, my process id is %d/n",getpid());
        else
        {
               printf("i am the parent process, my process id is %d/n",getpid());
              sleep(2);
              wait();
       }

}
 

i am the child process, my process id is 15806
the exit pid:15806
i am the parent process, my process id is 15805
the exit pid:15805

这是gcc测试下的运行结果。

 

关于fork函数,功能就是产生子进程,由于前面说过,进程就是执行的流程活动。

那么fork产生子进程的表现就是它会返回2次,一次返回0,顺序执行下面的代码。这是子进程。

一次返回子进程的pid,也顺序执行下面的代码,这是父进程。

(为何父进程需要获取子进程的pid呢?这个有很多原因,其中一个原因:看最后的wait,就知道父进程等待子进程的终结后,处理其task_struct结构,否则会产生僵尸进程,扯远了,有兴趣可以自己google)。

如果fork失败,会返回-1.

额外说下atexit( print_exit ); 需要的参数肯定是函数的调用地址。

这里的print_exit 是函数名还是函数指针呢?答案是函数指针,函数名永远都只是一串无用的字符串。

某本书上的规则:函数名在用于非函数调用的时候,都等效于函数指针。

 

说到子进程只是一个额外的流程,那他跟父进程的联系和区别是什么呢?

我很想建议你看看linux内核的注解(有兴趣可以看看,那里才有本质上的了解),总之,fork后,子进程会复制父进程的task_struct结构,并为子进程的堆栈分配物理页。理论上来说,子进程应该完整地复制父进程的堆,栈以及数据空间,但是2者共享正文段。

关于写时复制:由于一般 fork后面都接着exec,所以,现在的 fork都在用写时复制的技术,顾名思意,就是,数据段,堆,栈,一开始并不复制,由父,子进程共享,并将这些内存设置为只读。直到父,子进程一方尝试写这些区域,则内核才为需要修改的那片内存拷贝副本。这样做可以提高 fork的效率。

 

三.多线程

线程是可执行代码的可分派单元。这个名称来源于“执行的线索”的概念。在基于线程的多任务的环境中,所有进程有至少一个线程,但是它们可以具有多个任务。这意味着单个程序可以并发执行两个或者多个任务。

 

简而言之,线程就是把一个进程分为很多片,每一片都可以是一个独立的流程。这已经明显不同于多进程了,进程是一个拷贝的流程,而线程只是把一条河流截成很多条小溪。它没有拷贝这些额外的开销,但是仅仅是现存的一条河流,就被多线程技术几乎无开销地转成很多条小流程,它的伟大就在于它少之又少的系统开销。(当然伟大的后面又引发了重入性等种种问题,这个后面慢慢比较)。

还是先看linux提供的多线程的系统调用:

 

int pthread_create(pthread_t *restrict tidp,
                   const pthread_attr_t *restrict attr,
                   void *(*start_rtn)(void),
                   void *restrict arg);
 
Returns: 0 if OK, error number on failure
 

第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。

 

+ expand sourceview plaincopy to clipboardprint?
#include<stdio.h>  
#include<string.h>  
#include<stdlib.h>  
#include<unistd.h>  
#include<pthread.h>  
 
   
void* task1(void*);  
void* task2(void*);  
 
 
void usr();  
int p1,p2;  
 
int main()  
{  
    usr();  
    getchar();  
    return 1;  
}  
 
   
 
void usr()  
{  
       pthread_t pid1, pid2;  
    pthread_attr_t attr;  
       void *p;  
        int ret=0;  
       pthread_attr_init(&attr);         //初始化线程属性结构  
       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);   //设置attr结构为分离  
       pthread_create(&pid1, &attr, task1, NULL);         //创建线程,返回线程号给pid1,线程属性设置为attr的属性,线程函数入口为task1,参数为NULL  
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);  
pthread_create(&pid2, &attr, task2, NULL);  
//前台工作  
 
ret=pthread_join(pid2, &p);         //等待pid2返回,返回值赋给p  
       printf("after pthread2:ret=%d,p=%d/n", ret,(int)p);            
 
}  
 
void* task1(void *arg1)  
{  
printf("task1/n");  
//艰苦而无法预料的工作,设置为分离线程,任其自生自灭  
    pthread_exit( (void *)1);  
 
}  
 
void* task2(void *arg2)  
{  
    int i=0;  
    printf("thread2 begin./n");  
    //继续送外卖的工作  
    pthread_exit((void *)2);  
} 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>

 
void* task1(void*);
void* task2(void*);


void usr();
int p1,p2;

int main()
{
    usr();
    getchar();
    return 1;
}

 

void usr()
{
       pthread_t pid1, pid2;
    pthread_attr_t attr;
       void *p;
        int ret=0;
       pthread_attr_init(&attr);         //初始化线程属性结构
       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);   //设置attr结构为分离
       pthread_create(&pid1, &attr, task1, NULL);         //创建线程,返回线程号给pid1,线程属性设置为attr的属性,线程函数入口为task1,参数为NULL
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&pid2, &attr, task2, NULL);
//前台工作

ret=pthread_join(pid2, &p);         //等待pid2返回,返回值赋给p
       printf("after pthread2:ret=%d,p=%d/n", ret,(int)p);         

}

void* task1(void *arg1)
{
printf("task1/n");
//艰苦而无法预料的工作,设置为分离线程,任其自生自灭
    pthread_exit( (void *)1);

}

void* task2(void *arg2)
{
    int i=0;
    printf("thread2 begin./n");
    //继续送外卖的工作
    pthread_exit((void *)2);
}

 

这个多线程的例子应该很明了了,主线程做自己的事情,生成2个子线程,task1为分离,任其自生自灭,而task2还是继续送外卖,需要等待返回。(因该还记得前面说过僵尸进程吧,线程也是需要等待的。如果不想等待,就设置线程为分离线程)

 额外的说下,linux下要编译使用线程的代码,一定要记得调用pthread库。如下编译:

 gcc -o pthrea -pthread  pthrea.c


 

四.比较以及注意事项

 

1.看完前面,应该对多进程和多线程有个直观的认识。如果总结多进程和多线程的区别,你肯定能说,前者开销大,后者开销较小。确实,这就是最基本的区别。

2.线程函数的可重入性:

说到函数的可重入,和线程安全,我偷懒了,引用网上的一些总结。

 


线程安全:概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。

 

 

 

 

 


可重入:概念基本没有比较正式的完整解释,但是它比线程安全要求更严格。根据经验,所谓“重入”,常见的情况是,程序执行到某个函数foo()时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理函数的执行过程中,又恰恰也会进入到刚刚执行的函数foo(),这样便发生了所谓的重入。此时如果foo()能够正确的运行,而且处理完成后,之前暂停的foo()也能够正确运行,则说明它是可重入的。


线程安全的条件:


要确保函数线程安全,主要需要考虑的是线程之间的共享变量。属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器。因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访问时,如果要保证线程安全,则必须通过加锁的方式。


可重入的判断条件:

 

要确保函数可重入,需满足一下几个条件:

1、不在函数内部使用静态或全局数据
2、不返回静态或全局数据,所有数据都由函数的调用者提供。
3、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
4、不调用不可重入函数。

 

 

可重入与线程安全并不等同,一般说来,可重入的函数一定是线程安全的,但反过来不一定成立。它们的关系可用下图来表示:

 

 

比如:strtok函数是既不可重入的,也不是线程安全的;加锁的strtok不是可重入的,但线程安全;而strtok_r既是可重入的,也是线程安全的。

 


如果我们的线程函数不是线程安全的,那在多线程调用的情况下,可能导致的后果是显而易见的——共享变量的值由于不同线程的访问,可能发生不可预料的变化,进而导致程序的错误,甚至崩溃。

3.关于IPC(进程间通信)

由于多进程要并发协调工作,进程间的同步,通信是在所难免的。

稍微列举一下linux常见的IPC.

 

linux下进程间通信的几种主要手段简介:

管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
或许你会有疑问,那多线程间要通信,应该怎么做?前面已经说了,多数的多线程都是在同一个进程下的,它们共享该进程的全局变量,我们可以通过全局变量来实现线程间通信。如果是不同的进程下的2个线程间通信,直接参考进程间通信。

4.关于线程的堆栈

说一下线程自己的堆栈问题。

是的,生成子线程后,它会获取一部分该进程的堆栈空间,作为其名义上的独立的私有空间。(为何是名义上的呢?)由于,这些线程属于同一个进程,其他线程只要获取了你私有堆栈上某些数据的指针,其他线程便可以自由访问你的名义上的私有空间上的数据变量。(注:而多进程是不可以的,因为不同的进程,相同的虚拟地址,基本不可能映射到相同的物理地址)

5.在子线程里fork

看过好几次有人问,在子线程函数里调用system或者 fork为何出错,或者fork产生的子进程是完全复制父进程的吗?

我测试过,只要你的线程函数满足前面的要求,都是正常的。


+ expand sourceview plaincopy to clipboardprint?
#include<stdio.h>  
#include<string.h>  
#include<stdlib.h>  
#include<unistd.h>  
#include<pthread.h>  
                                                                                                  
void* task1(void *arg1)  
{  
    printf("task1/n");  
    system("ls");  
    pthread_exit( (void *)1);  
}  
                                                                                                  
int main()  
{  
  int ret=0;  
  void *p;  
   int p1=0;  
   pthread_t pid1;  
    pthread_create(&pid1, NULL, task1, NULL);  
    ret=pthread_join(pid1, &p);  
     printf("end main/n");  
    return 1;  
} 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
                                                                                               
void* task1(void *arg1)
{
    printf("task1/n");
    system("ls");
    pthread_exit( (void *)1);
}
                                                                                               
int main()
{
  int ret=0;
  void *p;
   int p1=0;
   pthread_t pid1;
    pthread_create(&pid1, NULL, task1, NULL);
    ret=pthread_join(pid1, &p);
     printf("end main/n");
    return 1;
}
 

上面这段代码就可以正常得调用ls指令。

不过,在同时调用多进程(子进程里也调用线程函数)和多线程的情况下,函数体内很有可能死锁。

具体的例子可以看看这篇文章。

http://www.cppblog.com/lymons/archive/2008/06/01/51836.aspx


End:暂时写到这吧,总结这东西,看来真不适合我写。有空了,想到什么了,再回来修修补补吧。

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/hairetz/archive/2009/06/19/4281931.aspx

DMDiff(2025):一种基于SAR光学数据融合的双分支多模态条件引导扩散模型-k学长深度学习专栏 DMDiff提出了一种基于扩散模型的多模态遥感图像去云方法,通过双分支网络分别提取SAR的结构信息和光学图像的光谱特征,再利用跨模态注意力机制实现特征融合。创新性地采用IAP策略直接预测无云图像而非噪声,有效解决了传统方法在遥感图像处理中易出现的光谱失真问题。实验表明该方法在PSNR等指标上显著优于现有技术,但存在计算量大、生成速度慢等不足。未来可结合加速采样策略和几何约束进一步优化。 阅读详情

相关推荐

PWM与光耦的完美联姻:低成本4-20mA转换方案揭秘

本文揭秘了PWM与光耦结合的低成本4-20mA转换方案,适用于工业自动化领域。通过PWM信号控制输出电流,光耦实现电气隔离,该方案成本低廉、电路简单且隔离可靠。文章详细介绍了两种经典电路实现方案,包括四光耦线性模式方案和PWM控制LM317方案,并提供了实战技巧与优化策略,帮助中小企业和电子DIY爱好者构建经济高效的4-20mA转换系统。

weixin_29229055的博客 536

Linux线程安全函数和可重入

  这俩个概念就不讲了,你需要明确的是可重入一定是线程安全的,因为多线程访问本质就是一种线程重入的体现。还是说下吧。所以当你在linux下编程想一些函数能不能多线程这么用的时候其实就是在考虑线程安全问题!比如你考虑我多个线程使用消息队列,会不会出问题,当然不会,因为消息队列是线程安全的。内部实现了锁机制。当然下面这篇说理也够透彻!转载 https://www.ibm.com/developerwo...

张飞online博客 4652

ArcGIS基于DEM提取微流域单元(附练习数据下载)

流域作为一个相对独立的地理单元,与行政区的划分有着本质上的区别。流域的划分更注重自然因素,流域作为一个综合的自然整体,在其内部形成了一个天然的物质与能量流动的场所,并通过水流的作用,与周围的区域进行物质和能量的交换。流域的精确划分作为一个研究的基础工作,那么接下来给大家说一下利用DEM提取小流域的案例教程——以贵州省遵义市正安县为例。 1 数据获取 地理空间数据云(http://www.gscloud.cn/),数据分辨率为30m。也可直接点击这篇直接下载→全国30m90mDEM下载。 若想要获得更高精度.

qq_43173805的博客 4834

【Linux】线程安全-生产者消费者模型

生产者消费者模型 123规则 应用场景 优点 忙闲不均 生产者和消费者解耦 支持高并发 代码模拟

weixin_56916549的博客 1084

FreeRTOS OTA实战:从Bootloader设计到安全升级的完整流程(附MQTT示例代码)

本文详细介绍了在FreeRTOS系统中实现安全OTA固件升级的完整流程。内容涵盖从Bootloader设计、存储分区规划到与MQTT协议集成的OTA Agent任务开发,并重点解析了固件签名验证、防回滚等关键安全机制,为嵌入式物联网设备提供了一套高可靠性的远程升级解决方案。

weixin_29248653的博客 159

Python大数据舆情分析系统开发实战

舆情监测系统是大数据分析的重要应用场景,通过自然语言处理(NLP)技术解析社交媒体文本情感倾向。基于Python技术栈的解决方案整合了Scrapy爬虫框架进行数据采集,PySpark处理海量文本数据,结合SnowNLP和Jieba实现中文语义分析。系统采用微服务架构设计,包含数据采集层、处理层、存储层和应用层,通过情感分析优化和实时热点检测算法提升监测准确率。典型应用包括企业品牌监测、公共事件预警等场景,开发过程中需特别注意数据合规性和分布式集群的性能调优。

weixin_34408624的博客 387

iOS 随意设定 子控制器view的位置

可以在父控制器中添加子view定好位置 然后,把子控制器的view添加到这个父控制器的子view上面

allanGold 1718

在已有win10系统下安装Ubuntu,最后出现执行‘grub-install/dev/nvme0n1p5‘失败的致命错误的解决方案

本人电脑型号戴尔灵越,两个SSD512G固态硬盘,c盘为系统盘. Ubuntu版本为20.04LTS,在官网下载https://ubuntu.com/download/desktop/thank-you?version=20.04.3&architecture=amd64 系统盘制作工具为Rufus-3.15http://rufus.ie/zh/ 安装过程网上很多,在这里就不赘述了. 其他安装过程都很顺利,直至安装最后出现这个 本来安装了到最后还以为成了,结果又不行...... 后.

XiaoChen_gugugu的博客 1万+

多线程与多进程详细

一.进程和线程的概念 1.进程(最小的资源单位):   进程:就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。     程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成;     数据集;则是程序在执行过程中所需要使用的资源;     进程控制块:用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。   进程比线程更早出现,计算机早期处理代码时,使用的是串行的方法,假设计算机在运行A

Prince的博客 1万+

告别时钟树平衡噩梦:在Innovus中巧妙设置stop/ignore pin来优化分段时钟网络

本文深入探讨了在Innovus工具中利用stop/ignore pin优化分段时钟树网络的高阶技巧。针对数字IC后端设计中的时钟树平衡难题,详细解析了特殊引脚属性的战略应用场景和配置方法,帮助工程师有效解决SoC设计中复杂的时钟结构问题,显著提升时序收敛效率。

weixin_30836759的博客 288

CS5212芯片实战:手把手教你设计DP转VGA转换电路(附完整原理图)

本文详细介绍了CS5212芯片在DP转VGA转换电路设计中的实战应用,包括芯片架构解析、核心电路设计要点、PCB布局与电磁兼容设计、调试技巧及进阶应用开发。通过完整的原理图和实用设计指南,帮助工程师快速掌握高可靠转换器的设计方法,特别适合需要国产化替代方案的场景。

weixin_30576827的博客 390

多进程及多线程的区别

一.两者区别 多进程和多线程的主要区别是:线程是进程的子集(部分),一个进程可能由多个线程组成。多进程的数据是分开的、共享复杂,需要用IPC;但同步简单。多线程共享进程数据,共享简单;但同步复杂。 (1)多进程 进程是程序在计算机上的一次执行活动,即正在运行中的应用程序,通常称为进程。当你运行一个程序,你就启动了一个进程。每个进程都有自己独立的地址空间(内存空间),每当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在这个独立的内存空间中运行。 在同一个时间里,同一个计算机系统中如

Welcome To kua_fuXz's Blog 1万+

TRAE智能体开发:TRAE概述

TRAE(/treɪ/)深度融合 AI 能力,是一名能够理解需求、调用工具并独立完成各类开发任务的“AI 开发工程师”,帮助你高效推进每一个项目。

王国平的博客 1264

多线程与多进程的理解

参考https://www.liaoxuefeng.com/ 线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。 多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。 在Unix/Linux下,可以使用fork()调用实现多进程。 要实现跨平台的多进程,可以使用mul...

asd0351992的博客 179

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

多线程和多进程的区别

多线程和多进程的区别(小结) 标签: 多线程linuxsemaphoresystemlinux内核signal 2009-06-19 09:33 160284人阅读 评论(36) 收藏 举报  分类: linux(20)  版权声明:本文为博主原创文章,未经博主允许不得转载。 很想写点关于多进程和多线程的东西,我确实很爱他们。但是每每想动手写点关于他们的

boshuzhang的专栏 248

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

python 伪多线程_python伪多线程

广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!本文首发于本人博客,转载请注明出处 写在前面作者电脑有 4 个 cpu,因此使用 4 个线程测试是合理的本文使用的 cpython 版本为 3. 6.4 本文使用的 pypy 版本为 5.9. 0-beta0,兼容 python 3.5 语法本文使用的 jython 版本为 2. 7...

weixin_39634898的博客 547

进程和线程

很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。 什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。 现在,多核CPU已经非...

LH552315的博客 171

进程+线程+协程+php,进程、线程和协程三者之间的区别和联系

一、进程、线程、协程1,进程进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。2,线程(thread)(内核级线程)线程,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(...

weixin_39705794的博客 550

java多线程详解

文章目录多线程基础进程进程 vs 线程多线程创建新线程线程的优先级练习小结线程的状态小结中断线程小结守护线程练习小结线程同步不需要synchronized的操作小结同步方法小结死锁死锁练习小结 转载于:https://www.liaoxuefeng.com/wiki/1252599548343744/1266265175882464 多线程基础 现代操作系统(Windows,macOS,Linux)都可以执行多任务。多任务就是同时运行多个任务。 CPU执行代码都是一条一条顺序执行的,但是,即使是单核cpu

qq_41854911的博客 740

进程和线程的理解

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34050427的博客 82

Python进程和线程

Python进程和线程 1.多任务的概念1.1 多任务的执行方式1.1.1 并发1.1.2 并行 1.2 总结 2. 什么是进程3. 创建进程的常用方式3.1 使用multiprocessing创建进程3.2 使用Process子类创建进程3.3 ...

guiyin1150的博客 281

python-进程和线程

什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。 现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢? 答案...

weixin_30432007的博客 88

进程和线程的概述

进程和线程的概述 ============================================================================= 1:要想了解多线程,必须先了解线程,而要想了解线程,必须先了解进程,因为线程是依赖于进程而存在。 -------------------------------------- 2:...

weixin_34403693的博客 191

线程和进程(一)

为什么80%的码农都做不了架构师?>>> ...

weixin_33807284的博客 91

Python使用中常见问题总结(二)

尊敬的读者您好:笔者很高兴自己的文章能被阅读,但原创与编辑均不易,所以转载请必须注明本文出处并附上本文地址超链接以及博主博客地址:https://blog.youkuaiyun.com/vensmallzeng。若觉得本文对您有益处还请帮忙点个赞鼓励一下,笔者在此感谢每一位读者,如需联系笔者,请记下邮箱:zengzenghe@gmail.com,谢谢合作! 一、Python的内存管理机制?...

Vensmallzeng的博客 397
上一篇: 有关数据源的问题,搞掂你,shit!!!
下一篇: String老问题了,搞掂你!!!
Java_Cowboy
博客等级 码龄19年 59粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值