Có vẻ như bạn đang sử dụng mô-đun multiprocessing
. Bạn đã không nói, và đó là một chút thông tin quan trọng.
Hàm .map()
trên một thể hiện multiprocessing.Pool()
lấy hai đối số: một hàm và một chuỗi. Hàm sẽ được gọi với các giá trị kế tiếp từ chuỗi. Bạn đang cố gắng để vượt qua y
và một chuỗi và điều đó sẽ không hoạt động.
Bạn có thể tạo một chuỗi như sau: ((y, x) for x in input)
và viết hàm lấy một đối số, một bộ và sau đó thực hiện điều đúng với nó. Tôi chỉ sử dụng multiprocessing.Pool()
để chạy các quy trình đọc và ghi tệp đĩa, vì vậy tôi không chắc chắn ý tưởng cơ bản sẽ hoạt động như thế nào ở đây: Tôi không chắc chắn bạn sẽ có thể thay đổi một dict như bạn đang cố gắng làm .
Tôi khuyên bạn chỉ nên chuyển các giá trị trở lại từ hàm của bạn, sau đó thu thập chúng để tạo kết quả cuối cùng của bạn. Tôi chỉ kiểm tra mã này và nó hoạt động:
import multiprocessing as mp
def f(x):
return (x, x*x)
if __name__ == '__main__':
pool = mp.Pool()
inputs = range(10)
result = dict(pool.map(f, inputs))
result
được thiết lập để: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
Hãy thay đổi nó để thay vì máy tính x*x
nó sẽ nâng cao x
một số quyền lực, và sức mạnh sẽ được cung cấp. Và chúng ta hãy làm cho nó lấy một đối số khóa chuỗi. Điều này có nghĩa là f()
cần lấy tham số tuple, trong đó tuple sẽ là (key, x, p)
và nó sẽ tính x**p
.
import multiprocessing as mp
def f(tup):
key, x, p = tup # unpack tuple into variables
return (key, x**p)
if __name__ == '__main__':
pool = mp.Pool()
inputs = range(10)
inputs = [("1**1", 1, 1), ("2**2", 2, 2), ("2**3", 2, 3), ("3**3", 3, 3)]
result = dict(pool.map(f, inputs))
Nếu bạn có một vài trình tự và bạn cần phải tham gia cùng họ với nhau để tạo ra một chuỗi duy nhất cho ở trên, nhìn vào sử dụng zip()
hoặc có lẽ itertools.product
.
Điều này nghe giống như một công việc cho Redis! –
Redis là gì ?? – Amir
http://www.google.com/search?q=redis –