我是一个新手,我正在尝试多线程。
我想写一个使用多线程的python3脚本,在每个核心上生成CPU负载,然后测量负载并记录它。
我写了一个小脚本,它从NIST随机性信标中获取一个随机生成的数字,并将其用作种子来生成一个“随机”数字。
我在四个不同的线程上运行同一函数的四个副本,并且有第五个线程正在运行linux命令来记录cpu活动。每个函数都有一个布尔值,因此在函数完成工作后,它将翻转该开关,以便监视(cpu日志)函数将在所有函数完成时停止日志记录。
正在创建data.out,但由于for循环和未创建的cpu.log,它只有一个随机数,而不是应该存在的100。
我不确定我哪里搞砸了。
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个随机数:
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")(编辑)-这是我做一个多线程多核版本的尝试:
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()发布于 2020-01-22 23:14:26
有几件事。首先,您使用的是进程(在内部,每个进程至少有一个线程)而不是线程(一个进程和多个线程)。进程的行为将根据您当前的cpu负载而有所不同。您可以打印每个函数的开始和结束,以查看p5是否确实先于其他函数启动。
主要问题是您的while条件
while t1 and t2 and t3 and t4 is False:t1已为false,因此while循环将永远不会执行。您的条件是检查是否全部为真,而t4仅为假。
我会将t1,t2,t3,t4初始化为True,并在完成后将其设置为False。
and while条件为
while t1 or t2 or t3 or t4:或者使用您现有的代码
while t1 is False or t2 is False or t3 is False or t4 is False:您可能想要输出,直到任何一个进程正在运行,或者如果您想要停止日志记录(如果其中任何一个进程已完成),则使用"and“
发布于 2020-01-22 23:43:45
使用线程并将变量设置为全局变量,以便它反映在其他线程中。为了简单起见,我也改成了seed
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")样本输出
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.61https://stackoverflow.com/questions/59862288
复制相似问题