
多线程和多进程
文章平均质量分 63
JasonLiu1919
微信公众号《小窗幽记机器学习》。却顾所来径,苍苍横翠微。个人微信号:onepieceand
展开
-
Python多进程处理数据
背景假设有1千万任务数据,每条数据处理耗时1s,那么如何加速整个任务的处理速度?其中一种解决方案就是使用多进程处理。解决方案pandas + pandarallel安装pandarallel: pip install pandarallel示例# -*- coding: utf-8 -*-# @Time : 2022/5/21 6:14 下午# @Author : JasonLiu# @FileName: test.pyimport timeimport pandas as p原创 2022-05-21 19:33:22 · 1160 阅读 · 0 评论 -
python多线程实践
背景:海量数据任务的并发处理,IO较为频繁,所以采用多线程的方式进行处理方案:一个主线程进行任务的分发,另外再独立创建一定数量的并发工作线程代码:# -*- coding: utf-8 -*-__author__ = 'jasonliu''''由于是IO密集型,采用用线程的方式进行处理注意本版本代码仅仅适用于python3'''import hashlibimport jsonimpo原创 2017-09-21 20:38:09 · 429 阅读 · 0 评论 -
Python线程池使用
背景多线程不能利用CPU多核优势,IO密集型可用多线程,CPU密集型适合用多进程。在采用多线程的时候就无需手动根据任务数量来创建线程,而是在建立线程池之后,不断地对线程池中空闲线程进行任务的分配。 使用线程池的主要优点: (1)可以控制产生线程的数量。通过预先创建一定数量的工作线程并限制其数量,控制线程对象的内存消耗。 (2)降低系统开销和资源消耗。通过对多个请求重用线程,线程创建、销毁的开销原创 2017-04-25 21:20:34 · 3140 阅读 · 0 评论 -
并行-问题拾遗
背景: 正做并行设计的时候,报错: terminate called after throwing an instance of ‘std::bad_alloc’ 查看代码,发现是在做并行计算任务id(字符串)获取之后,对id做一次按照\t的分割,并将结果存储于vector之中,但是末尾的结束符是没有\t的,所以会字符分割失败。这部分逻辑会在结束符的时候抛出异常。 切记,这种边界情况的处理。原创 2017-03-27 15:51:15 · 459 阅读 · 0 评论 -
多线程编程-通过fork方式创建任务进程
背景在多进程中需要创建一个任务进程进行待处理任务的分发工作。也就是说,需要在主进程中detach剥离出一个进程,且该子进程独立于主进程,进行独立的任务发送。如果是单纯在主进程中fork一个子进程的话,如果进行了wait等待操作,那么该任务进程就失去了独立性,无法实现边取任务边分发任务。而如果是不进行wait等待操作的话,那么子进程可能也会执行后续创建多个处理任务的进程,使得出现的并行进程数量为预期的原创 2017-03-07 16:02:11 · 831 阅读 · 0 评论 -
python多进程编程
背景:采用多进程方式处理多任务方式1:基于multiprocessing代码:# -*- coding: utf-8 -*-__author__ = 'jason'#加入并行元素,提升处理速度,注意window和linux的多进程是不同的使用方法和不同的库,本文的代码是基于window系统import urllib2import osimport Queuefrom multiproces原创 2017-01-02 14:28:57 · 403 阅读 · 0 评论 -
多进程编程之进程间通信-管道和消息队列
1.进程间通信Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信方法:管道、消息队列、共享内存、信号量、套接口等等。 2.2.1 管道管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信。 无名管道pipe无名管道由pipe()函数创建: #include <unistd.h> i原创 2016-09-21 10:27:10 · 9583 阅读 · 1 评论 -
多进程编程之进程间通信-共享内存,信号量和套接字
1. 背景本文将介绍进程通信中的共享内存,信号量和套接字方法。2. 共享内存共享内存是最快的IPC(进程间通信)方式。共享内存是一个程序向内存写数据,另一个程序读数据,共享内存牵扯到同步的问题,一般有三种方案可以实现共享资源的同步。它们分别是信号量,记录锁和互斥量。 使用信号量,首先服务端创建一个只含一个信号的信号量集合,并初始化为1。占据资源,则以sem_op=-1调用semop函数。释放资源,原创 2016-10-09 11:11:56 · 4233 阅读 · 0 评论 -
多进程编程学习笔记-1-进程基础
1.背景在一个程序启动主进程后,可能需要再启动一个或多个进程来完成独立的多个任务。多进程编程的主要内容包括进程控制和进程间通信,在了解这些之前,需要先简单了解进程的结构。 2.Linux下进程的结构Linux下一个进程在内存里有三部分的数据,”代码段”、”堆栈段”和”数据段”。一般的CPU都有上述三种段寄存器,以方便操作系统的运行。这三个部分也是构成一个完整的执行序列的必要的部分。 “代码段”,原创 2016-09-16 17:04:14 · 867 阅读 · 0 评论 -
多线程的文件读写操作讨论
背景:对于13GB大小的文件,逐行读取,后写到一个新文件。单个线程,进行耗时242s。这里的处理操作比较简单,仅仅是直接写到一个新的文件。如果处理操作耗时越长,多线程的优点越能够显现出来。采用多线程:比如创建5个线程,进行。如果读用一个锁,写再用一个锁的话,耗时649s。如果读写用相同一个锁的话,耗时608。两者差别不太。发现是因为写操作选择不合理,该操作,要进行等待,将时原创 2016-01-08 11:30:14 · 13125 阅读 · 11 评论 -
多线程编程-detach
背景线程1中获取任务之后,需要做长时间的处理,但是线程1不能够长时间等待,需要在获取完任务之后,就反馈信息。方案设计:线程1在接受任务之后,新建一个线程,并调用detcha(),使该线程分离,允许独立运行。 代码://新建一个线程的方式,用于处理其他任务void sayhello(){ //模拟线程处理任务 sleep(30); std::cout<<"son thre原创 2016-08-09 14:18:32 · 838 阅读 · 0 评论 -
多线程编程学习笔记-海量数据求和
背景任务数量大约100W,如果在一个线程下跑的话,巨耗时,所以考虑,在主线程下,创建多线程的方式,并行进行海量任务的处理。本文以多次循环求和作为例子。单线程:int main(){boost::posix_time::ptime start =boost::posix_time::microsec_clock::local_time();uint64_t result = 0;for (in原创 2016-08-12 11:00:14 · 1655 阅读 · 0 评论