Tôi sử dụng Boto để truy cập Amazon S3. Và để tải tệp lên, tôi có thể gán chức năng gọi lại. Vấn đề là tôi không thể truy cập các biến cần thiết từ hàm gọi lại đó cho đến khi tôi làm cho chúng toàn cầu. Mặt khác, nếu tôi làm cho chúng toàn cầu, chúng là toàn cầu cho tất cả các nhiệm vụ Celery khác (cho đến khi tôi khởi động lại Celery), khi việc tải lên tệp được thực thi từ một nhiệm vụ Celery.Làm thế nào để truy cập (và chỉnh sửa) các biến từ một chức năng gọi lại?
Đây là chức năng tải lên tệp JSON có thông tin về tiến trình chuyển đổi video.
def upload_json():
global current_frame
global path_to_progress_file
global bucket
json_file = Key(bucket)
json_file.key = path_to_progress_file
json_file.set_contents_from_string('{"progress": "%s"}' % current_frame,
cb=json_upload_callback, num_cb=2, policy="public-read")
Và đây là 2 chức năng gọi lại để tải lên khung được tạo bởi ffmpeg trong quá trình chuyển đổi video và tệp JSON với thông tin tiến trình.
# Callback functions that are called by get_contents_to_filename.
# The first argument is representing the number of bytes that have
# been successfully transmitted from S3 and the second is representing
# the total number of bytes that need to be transmitted.
def frame_upload_callback(transmitted, to_transmit):
if transmitted == to_transmit:
upload_json()
def json_upload_callback(transmitted, to_transmit):
global uploading_frame
if transmitted == to_transmit:
print "Frame uploading finished"
uploading_frame = False
Về mặt lý thuyết, tôi có thể chuyển biến upload_frame sang hàm upload_json, nhưng sẽ không chuyển thành json_upload_callback khi Boto thực hiện.
Trong thực tế, tôi có thể viết một cái gì đó như thế này.
In [1]: def make_function(message):
...: def function():
...: print message
...: return function
...:
In [2]: hello_function = make_function("hello")
In [3]: hello_function
Out[3]: <function function at 0x19f4c08>
In [4]: hello_function()
hello
Tuy nhiên, không cho phép bạn chỉnh sửa giá trị từ hàm, chỉ cho phép bạn đọc giá trị.
def myfunc():
stuff = 17
def lfun(arg):
print "got arg", arg, "and stuff is", stuff
return lfun
my_function = myfunc()
my_function("hello")
Công trình này hoạt động.
def myfunc():
stuff = 17
def lfun(arg):
print "got arg", arg, "and stuff is", stuff
stuff += 1
return lfun
my_function = myfunc()
my_function("hello")
Và điều này cho phép UnboundLocalError: biến cục bộ 'stuff' được tham chiếu trước khi gán.
Cảm ơn.
dụ của bạn không hiển thị như thế nào uploading_frame được sử dụng, vì vậy rất khó để hiểu tại sao bạn sự kiện muốn nó. Tạo một ví dụ đơn giản hơn mà không cần bất kỳ thứ gì liên quan đến S3, rõ ràng hơn cho thấy vấn đề có lẽ cũng sẽ giúp ích. – dkagedal