Tôi gặp sự cố khi tôi cần chuyển chỉ mục của mảng tới hàm mà tôi xác định nội tuyến. Hàm này sau đó được truyền vào như một tham số cho một hàm khác mà cuối cùng sẽ gọi nó là một hàm gọi lại.Hành vi phân luồng lẻ trong python
Vấn đề là khi mã được gọi, giá trị của chỉ mục là sai. Cuối cùng tôi đã giải quyết điều này bằng cách tạo ra một giải pháp xấu xí nhưng tôi quan tâm đến việc hiểu những gì đang xảy ra ở đây. Tôi tạo ra một ví dụ nhỏ để chứng minh vấn đề:
from __future__ import print_function
import threading
def works_as_expected():
for i in range(10):
run_in_thread(lambda: print('the number is: {}'.format(i)))
def not_as_expected():
for i in range(10):
run_later_in_thread(lambda: print('the number is: {}'.format(i)))
def run_in_thread(f):
threading.Thread(target=f).start()
threads_to_run_later = []
def run_later_in_thread(f):
threads_to_run_later.append(threading.Thread(target=f))
print('this works as expected:\n')
works_as_expected()
print('\nthis does not work as expected:\n')
not_as_expected()
for t in threads_to_run_later: t.start()
Đây là kết quả:
this works as expected:
the number is: 0
the number is: 1
the number is: 2
the number is: 3
the number is: 4
the number is: 6
the number is: 7
the number is: 7
the number is: 8
the number is: 9
this does not work as expected:
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
Ai đó có thể giải thích những gì đang xảy ra ở đây? Tôi cho rằng nó có liên quan đến phạm vi bao quanh hoặc một thứ gì đó, nhưng một câu trả lời với một tham chiếu giải thích góc tối (đối với tôi) của phạm vi python sẽ có giá trị đối với tôi.
Tôi đang chạy mã này trên trăn 2.7.11
Tôi khuyên bạn nên kích hoạt trình gỡ rối [pdb] (https://docs.python.org/2/library/pdb.html) sẽ đủ, xóa phần làm việc như mong đợi của mã và chỉ cần thực hiện từng bước một , nó sẽ làm cho nó rõ ràng cho bạn rất nhanh về những gì là chính xác xảy ra –
@ TymoteuszPaul Tôi nghĩ rằng bạn đang hiểu lầm điểm của câu hỏi của tôi. Không phải là tôi không hiểu mã đang làm gì. Tôi không hiểu tại sao nó lại làm. Tôi đang tìm một câu trả lời giúp tôi hiểu ngôn ngữ * thực sự hoạt động như thế nào để tôi có thể giải thích tốt hơn về mã. Cảm ơn lời đề nghị mặc dù, tôi khá thích pdb. – Stephen