首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程随机数与CPU监控

多线程随机数与CPU监控
EN

Stack Overflow用户
提问于 2020-01-22 22:47:45
回答 2查看 59关注 0票数 0

我是一个新手,我正在尝试多线程。

我想写一个使用多线程的python3脚本,在每个核心上生成CPU负载,然后测量负载并记录它。

我写了一个小脚本,它从NIST随机性信标中获取一个随机生成的数字,并将其用作种子来生成一个“随机”数字。

我在四个不同的线程上运行同一函数的四个副本,并且有第五个线程正在运行linux命令来记录cpu活动。每个函数都有一个布尔值,因此在函数完成工作后,它将翻转该开关,以便监视(cpu日志)函数将在所有函数完成时停止日志记录。

正在创建data.out,但由于for循环和未创建的cpu.log,它只有一个随机数,而不是应该存在的100。

我不确定我哪里搞砸了。

代码语言:javascript
复制
from multiprocessing import Process
import urllib.request
import urllib.parse
import array as arr
import numpy as np
import random
import re
import os

t1 = False
t2 = False
t3 = False
t4 = False

def get_NIST_SEED():
    url = 'https://beacon.nist.gov/beacon/2.0/pulse/last'
    f = urllib.request.urlopen(url)
    data_set = str(f.read().decode('utf-8'))
    subStr = data_set
    subStr = re.findall(r'"outputValue" : "(.+?)"',data_set)
    subStr  = ''.join(subStr)
    NIST_SEED = ''.join(filter(str.isdigit, subStr))
    NIST_SEED = float(NIST_SEED)
    return NIST_SEED

def set_array():
    numbers = arr.array('d', [])
    return numbers


def generate_number(NIST_SEED, numbers):
    i = 0
    random_number = random.seed(NIST_SEED)
    for i in range(100):
        random_number = random.random()
        numbers.extend([random_number])
        np.savetxt('data.out', numbers)
        return numbers

def monitoring():
    while t1 and t2 and t3 and t4 is False:
        os.system("mpstat -u >> cpu.log")

def nist_1():
    returned_string = get_NIST_SEED()
    array = set_array()
    generate_number(returned_string,array)
    t1 = True

def nist_2():
    returned_string = get_NIST_SEED()
    array = set_array()
    generate_number(returned_string,array)
    t2 = True

def nist_3():
    returned_string = get_NIST_SEED()
    array = set_array()
    generate_number(returned_string,array)
    t3 = True

def nist_4():
    returned_string = get_NIST_SEED()
    array = set_array()
    generate_number(returned_string,array)
    t4 = True

def Main():
    p1 = Process(target=nist_1, args=())
    p2 = Process(target=nist_2, args=())
    p3 = Process(target=nist_3, args=())
    p4 = Process(target=nist_4, args=())
    p5 = Process(target=monitoring, args=())

    p5.start()
    p1.start()
    p2.start()
    p3.start()
    p4.start()

    p5.join()
    p1.join()
    p2.join()
    p3.join()
    p4.join()

for x in range(0,1):
    Main()
os.system("cat cpu.log")

生成器工作,并根据范围创建n个随机数:

代码语言:javascript
复制
import os
import numpy as np
import array as arr
import random
import urllib.request
import urllib.parse
import re

url = 'https://beacon.nist.gov/beacon/2.0/pulse/last'
f = urllib.request.urlopen(url)
data_set = str(f.read().decode('utf-8'))


subStr = data_set


subStr = re.findall(r'"outputValue" : "(.+?)"',data_set)
subStr  = ''.join(subStr)
NIST_SEED = ''.join(filter(str.isdigit, subStr))
NIST_SEED = float(NIST_SEED)

numbers = arr.array('d', [])

i = 0

random_number = random.seed(NIST_SEED)
for i in range(10):
    random_number = random.random()
    numbers.extend([random_number])

np.savetxt('data.out', numbers)

os.system("cat data.out")

(编辑)-这是我做一个多线程多核版本的尝试:

代码语言:javascript
复制
from multiprocessing import Process
import threading
import array as arr
import numpy as np
import random
import re
import os

def NIST_THREAD_CORE():
    t1 = True
    t2 = True
    t3 = True
    t4 = True

    def get_NIST_SEED():
        return random.random()

    def set_array():
        numbers = arr.array('d', [])
        return numbers


    def generate_number(NIST_SEED, numbers):
        i = 0
        random_number = random.seed(NIST_SEED)
        for i in range(100):
            random_number = random.random()
            numbers.extend([random_number])
            np.savetxt('data.out', numbers)
            return numbers

    def monitoring():
        print("In monitoring")
        while t1 or t2 or t3 or t4:
            os.system("mpstat -u >> cpu.log")

    def nist_1():
        print ("nist_1 begin")
        returned_string = get_NIST_SEED()
        array = set_array()
        generate_number(returned_string,array)
        global t1
        t1 = False
        print ("nist_1 end")

    def nist_2():
        print ("nist_2 begin")
        returned_string = get_NIST_SEED()
        array = set_array()
        generate_number(returned_string,array)
        global t2
        t2 = False
        print ("nist_2 end")

    def nist_3():
        print ("nist_3 begin")
        returned_string = get_NIST_SEED()
        array = set_array()
        generate_number(returned_string,array)
        global t3
        t3 = False
        print ("nist_3 end")

    def nist_4():
        print ("nist_4 begin")
        returned_string = get_NIST_SEED()
        array = set_array()
        generate_number(returned_string,array)
        global t4
        t4 = False

    def Main():
        p1 = threading.Thread(target=nist_1, args=())
        p2 = threading.Thread(target=nist_2, args=())
        p3 = threading.Thread(target=nist_3, args=())
        p4 = threading.Thread(target=nist_4, args=())
        p5 = threading.Thread(target=monitoring, args=())

        p5.start()
        p1.start()
        p2.start()
        p3.start()
        p4.start()

        p5.join()
        p1.join()
        p2.join()
        p3.join()
        p4.join()

    for x in range(0,1):
        Main()
        os.system("cat cpu.log")

NIST_THREAD_CORE()


if __name__ == "__main__":
    queue = Queue()

    processes = [Process(NIST_THREAD_CORE())]

    for p in processes:
        p.start()

    for p in processes:
        p.join()
EN

回答 2

Stack Overflow用户

发布于 2020-01-22 23:14:26

有几件事。首先,您使用的是进程(在内部,每个进程至少有一个线程)而不是线程(一个进程和多个线程)。进程的行为将根据您当前的cpu负载而有所不同。您可以打印每个函数的开始和结束,以查看p5是否确实先于其他函数启动。

主要问题是您的while条件

代码语言:javascript
复制
while t1 and t2 and t3 and t4 is False:

t1已为false,因此while循环将永远不会执行。您的条件是检查是否全部为真,而t4仅为假。

我会将t1,t2,t3,t4初始化为True,并在完成后将其设置为False。

and while条件为

代码语言:javascript
复制
while t1 or t2 or t3 or t4:

或者使用您现有的代码

代码语言:javascript
复制
while t1 is False or t2 is False or t3 is False or t4 is False:

您可能想要输出,直到任何一个进程正在运行,或者如果您想要停止日志记录(如果其中任何一个进程已完成),则使用"and“

票数 0
EN

Stack Overflow用户

发布于 2020-01-22 23:43:45

使用线程并将变量设置为全局变量,以便它反映在其他线程中。为了简单起见,我也改成了seed

代码语言:javascript
复制
from multiprocessing import Process
import threading
import array as arr
import numpy as np
import random
import re
import os

t1 = True
t2 = True
t3 = True
t4 = True

def get_NIST_SEED():
    return random.random()

def set_array():
    numbers = arr.array('d', [])
    return numbers


def generate_number(NIST_SEED, numbers):
    i = 0
    random_number = random.seed(NIST_SEED)
    for i in range(100):
        random_number = random.random()
        numbers.extend([random_number])
        np.savetxt('data.out', numbers)
        return numbers

def monitoring():
    print("In monitoring")
    while t1 or t2 or t3 or t4:
        os.system("mpstat -u >> cpu.log")

def nist_1():
    print ("nist_1 begin")
    returned_string = get_NIST_SEED()
    array = set_array()
    generate_number(returned_string,array)
    global t1
    t1 = False
    print ("nist_1 end")

def nist_2():
    print ("nist_2 begin")
    returned_string = get_NIST_SEED()
    array = set_array()
    generate_number(returned_string,array)
    global t2
    t2 = False
    print ("nist_2 end")

def nist_3():
    print ("nist_3 begin")
    returned_string = get_NIST_SEED()
    array = set_array()
    generate_number(returned_string,array)
    global t3
    t3 = False
    print ("nist_3 end")

def nist_4():
    print ("nist_4 begin")
    returned_string = get_NIST_SEED()
    array = set_array()
    generate_number(returned_string,array)
    global t4
    t4 = False
def Main():
    #p1 = Process(target=nist_1, args=())
    #p2 = Process(target=nist_2, args=())
    #p3 = Process(target=nist_3, args=())
    #p4 = Process(target=nist_4, args=())
    #p5 = Process(target=monitoring, args=())
    p1 = threading.Thread(target=nist_1, args=())
    p2 = threading.Thread(target=nist_2, args=())
    p3 = threading.Thread(target=nist_3, args=())
    p4 = threading.Thread(target=nist_4, args=())
    p5 = threading.Thread(target=monitoring, args=())

    p5.start()
    p1.start()
    p2.start()
    p3.start()
    p4.start()

    p5.join()
    p1.join()
    p2.join()
    p3.join()
    p4.join()

for x in range(0,1):
    Main()
os.system("cat cpu.log")

样本输出

代码语言:javascript
复制
In monitoring
 nist_1 begin
nist_2 begin
nist_3 begin
nist_4 begin
nist_1 end
nist_2 end
nist_3 end
nist_4 end
Linux 2.6.32-754.19.1.el6.x86_64 (njsdlpagtslx7)        01/22/2020      _x86_64_        (16 CPU)

10:41:19 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:41:19 AM  all   32.93    0.00    1.49    0.86    0.00    0.11    0.00    0.00   64.61
Linux 2.6.32-754.19.1.el6.x86_64 (njsdlpagtslx7)        01/22/2020      _x86_64_        (16 CPU)

10:41:19 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:41:19 AM  all   32.93    0.00    1.49    0.86    0.00    0.11    0.00    0.00   64.61
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59862288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档