我怎样才能使这个多线程?

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,"%")

您的代码有几个问题:

  1. 您在每个线程中将数字重置为 0。每次函数进入时,它们都会返回 0。
  2. 您的代码不是线程安全的。您不能在同一个号码的多个线程中使用 +=,否则会互相覆盖。

请记住,这段代码实际上不会更快,因为 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,"%")