我怎样才能使这个多线程?
How can I make this multithreaded?
我做了一个Python模拟骰子然后计算相对频率的脚本
我想,为什么不让它成为多线程呢?现在我被变量困住了。如果我 运行 这个,就像最后一个线程覆盖所有其他结果一样,所以它会 运行 多线程但只采用最后一个线程的结果。根据您的需要修改变量 tries,将其设置为 8,这样您会看到最后只有 2 个随机数被提取并计算为百分比。不要修改 NrThreads,因为它总是从 4.
开始
import threading
import random
### CONFIGURE
tries=8
NrThreads=4
triesThread=round(round(tries)/4)
###\CONFIGURE
def ThreadCode():
global one
global two
global three
global four
global five
global six
one=0
two=0
three=0
four=0
five=0
six=0
for i in range(0, triesThread):
number=random.randint(1,6)
if (number == 1):
one=one+1
if (number == 2):
two=two+1
if (number == 3):
three=three+1
if (number == 4):
four=four+1
if (number == 5):
five=five+1
if (number == 6):
six=six+1
thread1 = threading.Thread(target=ThreadCode)
thread1.start()
print("Started thread")
thread2 = threading.Thread(target=ThreadCode)
thread2.start()
print("Started thread")
thread3 = threading.Thread(target=ThreadCode)
thread3.start()
print("Started thread")
thread4 = threading.Thread(target=ThreadCode)
thread4.start()
print("Started thread")
thread1.join()
thread2.join()
thread3.join()
thread4.join()
print("Number 1: ", one)
print("Number 2: ", two)
print("Number 3: ", three)
print("Number 4: ", four)
print("Number 5: ", five)
print("Number 6: ", six)
p1=one/tries
print("Probability for number 1: ", p1)
for i in ([one, two, three, four, five, six]):
print(i/tries," ", i/tries*100,"%")
您的代码有几个问题:
- 您在每个线程中将数字重置为 0。每次函数进入时,它们都会返回 0。
- 您的代码不是线程安全的。您不能在同一个号码的多个线程中使用
+=
,否则会互相覆盖。
请记住,这段代码实际上不会更快,因为 Python 有一个全局解释器锁 (GIL),无论如何您都需要锁定所有添加项。
固定代码如下:
import threading
import random
### CONFIGURE
tries=8
NrThreads=4
triesThread=round(tries/4)
###\CONFIGURE
lock = threading.Lock()
one=0
two=0
three=0
four=0
five=0
six=0
def ThreadCode():
global one
global two
global three
global four
global five
global six
for i in range(0, triesThread):
number=random.randint(1,6)
with lock:
match number:
case 1:
one += 1
case 2:
two += 1
case 3:
three += 1
case 4:
four += 1
case 5:
five += 1
case 6:
six += 1
thread1 = threading.Thread(target=ThreadCode)
thread1.start()
print("Started thread")
thread2 = threading.Thread(target=ThreadCode)
thread2.start()
print("Started thread")
thread3 = threading.Thread(target=ThreadCode)
thread3.start()
print("Started thread")
thread4 = threading.Thread(target=ThreadCode)
thread4.start()
print("Started thread")
thread1.join()
thread2.join()
thread3.join()
thread4.join()
print("Number 1: ", one)
print("Number 2: ", two)
print("Number 3: ", three)
print("Number 4: ", four)
print("Number 5: ", five)
print("Number 6: ", six)
p1=one/tries
print("Probability for number 1: ", p1)
for i in ([one, two, three, four, five, six]):
print(i/tries," ", i/tries*100,"%")
我做了一个Python模拟骰子然后计算相对频率的脚本
我想,为什么不让它成为多线程呢?现在我被变量困住了。如果我 运行 这个,就像最后一个线程覆盖所有其他结果一样,所以它会 运行 多线程但只采用最后一个线程的结果。根据您的需要修改变量 tries,将其设置为 8,这样您会看到最后只有 2 个随机数被提取并计算为百分比。不要修改 NrThreads,因为它总是从 4.
开始import threading
import random
### CONFIGURE
tries=8
NrThreads=4
triesThread=round(round(tries)/4)
###\CONFIGURE
def ThreadCode():
global one
global two
global three
global four
global five
global six
one=0
two=0
three=0
four=0
five=0
six=0
for i in range(0, triesThread):
number=random.randint(1,6)
if (number == 1):
one=one+1
if (number == 2):
two=two+1
if (number == 3):
three=three+1
if (number == 4):
four=four+1
if (number == 5):
five=five+1
if (number == 6):
six=six+1
thread1 = threading.Thread(target=ThreadCode)
thread1.start()
print("Started thread")
thread2 = threading.Thread(target=ThreadCode)
thread2.start()
print("Started thread")
thread3 = threading.Thread(target=ThreadCode)
thread3.start()
print("Started thread")
thread4 = threading.Thread(target=ThreadCode)
thread4.start()
print("Started thread")
thread1.join()
thread2.join()
thread3.join()
thread4.join()
print("Number 1: ", one)
print("Number 2: ", two)
print("Number 3: ", three)
print("Number 4: ", four)
print("Number 5: ", five)
print("Number 6: ", six)
p1=one/tries
print("Probability for number 1: ", p1)
for i in ([one, two, three, four, five, six]):
print(i/tries," ", i/tries*100,"%")
您的代码有几个问题:
- 您在每个线程中将数字重置为 0。每次函数进入时,它们都会返回 0。
- 您的代码不是线程安全的。您不能在同一个号码的多个线程中使用
+=
,否则会互相覆盖。
请记住,这段代码实际上不会更快,因为 Python 有一个全局解释器锁 (GIL),无论如何您都需要锁定所有添加项。
固定代码如下:
import threading
import random
### CONFIGURE
tries=8
NrThreads=4
triesThread=round(tries/4)
###\CONFIGURE
lock = threading.Lock()
one=0
two=0
three=0
four=0
five=0
six=0
def ThreadCode():
global one
global two
global three
global four
global five
global six
for i in range(0, triesThread):
number=random.randint(1,6)
with lock:
match number:
case 1:
one += 1
case 2:
two += 1
case 3:
three += 1
case 4:
four += 1
case 5:
five += 1
case 6:
six += 1
thread1 = threading.Thread(target=ThreadCode)
thread1.start()
print("Started thread")
thread2 = threading.Thread(target=ThreadCode)
thread2.start()
print("Started thread")
thread3 = threading.Thread(target=ThreadCode)
thread3.start()
print("Started thread")
thread4 = threading.Thread(target=ThreadCode)
thread4.start()
print("Started thread")
thread1.join()
thread2.join()
thread3.join()
thread4.join()
print("Number 1: ", one)
print("Number 2: ", two)
print("Number 3: ", three)
print("Number 4: ", four)
print("Number 5: ", five)
print("Number 6: ", six)
p1=one/tries
print("Probability for number 1: ", p1)
for i in ([one, two, three, four, five, six]):
print(i/tries," ", i/tries*100,"%")