多线程

电脑杂谈  发布时间:2020-05-20 16:21:35  来源:网络整理

4核4线程和4核8线程_2核4线程和4核4线程_多线程

串行计算是解决计算问题的最简单,最直观的方法. 但是,当前服务器或个人计算机中使用的CPU已经进入多核时代,并且完全能够同时处理多个任务. 此时,如果仍使用串行计算,则无法充分利用CPU的计算能力. 因此,在处理更复杂的计算任务或面对大量数据时,应进行并行计算,并使用多个线程甚至多台计算机一起完成计算任务.

在这里,让我们首先研究最简单的并行计算-多线程计算.

多线程计算是指其中多个子任务使用独立线程并在执行计算任务时执行同时计算的处理方法. 在集算器中,可以使用fork语句执行多线程计算. 让我们首先使用以下示例来了解fork语句的使用:

$(演示)从EMPLOYEE中选择*

[销售多线程,研发,财务,生产]

叉B1

= A1.select(DEPT == A2)

= B2.minp(生日)

返回B3

在A1中,从中读取EMPLOYEE表中的数据:

使用fork语句在A2中执行多线程计算,然后选择B1每个部门中最老的员工. 执行后,A2中的结果如下:

使用多个线程执行代码时,请使用fork循环序列参数. 根据参数序列的长度,它将分为多个代码块,这些代码块同时执行fork语句. 拼成一个序列.

尽管使用fork与循环计算相似,但与常规的for循环不同. 在for循环中,代码块是使用单个线程顺序计算的,并且同时处理fork根据序列参数执行的计算.

为了进一步了解每个线程的执行情况,我们使用A2代码块中的输出函数将信息输出到控制台:

$(演示)从EMPLOYEE中选择*

2核4线程和4核4线程_多线程_4核4线程和4核8线程

[销售,研发,财务,生产]

叉B1

>输出(A2 +“-开始”)

= A1.select(DEPT == A2)

= B2.minp(生日)

>输出(A2 +“-end”)

返回B3

当执行A2的代码块时,当计算开始和结束时,信息分别在B2和C3中输出. 执行后,您可以在控制台中看到如下输出:

从输出结果可以看出,可以同时计算多个子任务,并且某些子任务可能还需要等待资源开始执行. 当执行多线程任务时,它是由系统分配的,并且系统将根据CPU的空闲状态控制每个子任务的执行. 每个子任务的计算时间将受其自己的计算量和执行线程的影响. 在不同情况下,多线程任务的执行通常会有所不同.

执行多线程计算时,还可以使用多个参数,例如:

$(演示)从EMPLOYEE中选择*

[销售,研发,财务,生产]

[德州,伊利诺伊州,俄亥俄州,佛罗里达州]

叉B1,[“ F”,“ F”,“ F”,“ F”],C1

= A1.select(DEPT == A2(1)&& GENDER == A2(2)&& STATE == A2(3))

= B2.minp(生日)

4核4线程和4核8线程_多线程_2核4线程和4核4线程

返回B3

当A2执行多线程计算时,将使用三个参数,并且计算将按顺序匹配,即,使用的参数为[Sales,F,Texas],[R&D,F,Illinois],[财务,俄亥俄州,F]和[生产,佛罗里达州,F]. 此时,在寻找年龄最大的员工时,将指定部门,性别和州. A2中的计算结果如下:

如果执行多线程计算时使用了多个参数,则每个参数的序列长度应相等.

我们可以注意到,在上面的代码中,在寻找各个部门的员工时,性别要求是相同的,并且此时,该参数可以写为单个值. 如以下示例:

$(演示)从EMPLOYEE中选择*

[销售,研发,财务,生产]

[德州,伊利诺伊州,俄亥俄州,佛罗里达州]

叉B1,“ F”,C1

= A1.select(DEPT == A2(1)&& GENDER == A2(2)&& STATE == A2(3))

> A1 = B2

返回B2

调用多线程计算时,使用相同的参数值将单值参数复制到每个线程. 另外,这里带有return的代码块的返回不是单个记录,而是一个安排. 此时,A2中的结果也将是一系列安排:

此外,在代码块中的C2中,将A1中的数据修改为所选子例程中的所选排列. 但是运行后,检查A1,您会发现A1中的数据尚未被多线程代码块修改. 实际上,当执行多线程操作的子例程时,它们将独立地复制当前的网格状态多线程,这彼此独立且互不影响. 因此,它们不会影响主代码中的数据.

fork语句不仅可以用于多线程计算,还可以用于集群计算. 有关相关内容,请参阅稍后在群集计算中的描述.

从执行的角度来看,用于多线程计算的代码与普通循环非常相似,那么为什么要使用多线程计算呢?让我们比较一下多线程和普通循环之间的区别:

4核4线程和4核8线程_多线程_2核4线程和4核4线程

=文件(“ PersonnelInfo.txt”)

=现在()

叉到(4)

=A1.import@t(; A3: 4)

返回B3.select(城市==“圣地亚哥”)

= A3.conj()

=间隔@ ms(A2,现在())

=现在()

为4

=A1.import@t(; A8: 4)

> A10 = A10 | B8.select(城市==“圣地亚哥”)

=时间间隔@毫秒(A7,现在为())

在此示例中,从文本文件PersonnelInfo.txt查找圣地亚哥的员工数据. 在第2-5行中使用多线程,在第7-10行中使用普通循环. 在计算时,B3和B8还采用分段读取数据的方法. 应该注意的是,当使用多线程计算时,forkto(4)不能缩写. 在A5和A10中,两种方法得出的结果相同:

B5和B10中这两种方法的估计时间如下:

多线程_2核4线程和4核4线程_4核4线程和4核8线程

可以发现,由于使用多线程计算时CPU使用率很高,因此计算时间将比使用普通循环要短.

由于使用多线程计算可以提高计算效率,因此拥有更多线程会更好吗?我们可以尝试一下:

=文件(“ PersonnelInfo.txt”)

=现在()

叉到(4)

=A1.import@t(; A3: 4)

返回B3.select(城市==“圣地亚哥”)

= A3.conj()

=间隔@ ms(A2,现在())

=现在()

叉到(400)

=A1.import@t(; A8: 400)

返回B8.select(城市==“圣地亚哥”)

= A8.conj()

=时间间隔@毫秒(A7,现在为())

在这里,第2〜5行使用多线程计算,并将计算分为4个线程. 第7〜10行也使用多线程计算,但是使用400个线程来完成计算. 在A5和A10中获得的结果与上一节相同.

现在查看B5和B10中的估计计算时间:

可以发现,尽管A8中的多线程计算使用大量线程,但是计算效率不仅没有得到显着提高,而且耗时也增加了. 这是因为系统的空闲CPU受到限制. 太多的线程仍然需要等待顺序计算,这通常不仅不能提高效率,而且还因为线程本身需要占用某些资源,从而导致速度变慢. 在实际使用中,线程数略小于系统中的CPU内核数,以获得更好的性能.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-216709-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 萧宝融
        萧宝融

        弄个公司上市圈钱

        • 张景源
          张景源

          你只是站在自己的位置上去看问题

      热点图片
      拼命载入中...