当我运行它时告诉我:NameError:名称'lock'未定义?

时间:2013-11-25 18:32:56

标签: python multithreading

•假设您有一个包含500,000个元素的数组(data = []),并且每个元素都被赋予1到10之间的随机值(random.randint(1,10))。

for i in range(500000):     数据[I] = random.randint()

•允许用户确定工作线程数(N)。用户可以输入1到10之间的值。无效值应该产生警告消息,并且线程计数设置为5。 •计算出一种自动将数组划分为N个相等段的方法,其中N是工作线程数(threadCount)。您无法创建子数组来处理此问题;你必须找出一种基于索引来划分原始数组的方法。假设用户输入的threadCount为4,下面提供了一个提示。

第1部分 (125,000个元素)第2部分 (125,000个元素)第3部分 (125,000个元素)第4部分 (125,000个元素)

•确定生成线程的方法,以便为每个线程分配一个要操作的数组段。这些线程应为其分配的段创建元素的总和。单线程函数原型如下:

def summation(st,end,threadIndex):

其中:st和end表示数组段的起点和终点,index是线程号。

您必须确定锁定机制以确保程序可以在阵列上同时运行。

•每个线程完成其工作后,主程序应通过将子和和潜水相加得到数组元素的总数来计算最终平均值。

最后的练习: 你可以扩展你的程序,以便使用你的工作线程用随机数填充数组吗? 我的代码:

import random
import thread
def su(st,end,i):
    global subtotal, data, locks
    for index in range(st,end+i):
        subtotal[i] += data[index]
    lock.release()

numth = int(100)

data = list(range(numth))

for index in range(len(data)):
    data[index] = random.randint(1,10)

wt=int(input("enter the number of working threads:"))

locks = list(range(wt))

subtotal = list(range(wt))

seg = len(data)/wt

st=0

for i in range(wt):
    st= i * seg
    end = st *seg -1
    thread.start_new_thread(su, ())
    locks = lock.acquire()
avg = sum(subtotal)/len(data)

print(avg)

2 个答案:

答案 0 :(得分:1)

你错过了

lock = threading.Lock()

我认为你应该导入threading而不是thread

This module constructs higher-level threading interfaces on top of the lower level thread module.

答案 1 :(得分:0)

你没有违反变量lock。以下是在Python中构建名为l的锁定对象的方法:

import threading
l = threading.Lock()

根据您的家庭作业需求进行调整是一项练习。