Tôi đang cố gắng mô phỏng một mạng các ứng dụng chạy bằng cách sử dụng xoắn. Là một phần của mô phỏng của tôi, tôi muốn đồng bộ hóa một số sự kiện nhất định và có thể cho mỗi quá trình xử lý một lượng lớn dữ liệu. Tôi đã quyết định sử dụng Sự kiện và Hàng đợi đa xử lý. Tuy nhiên, các quy trình của tôi đang bị treo.bị xoắn không tương thích với các sự kiện đa xử lý và hàng đợi?
Tôi đã viết mã ví dụ bên dưới để minh họa sự cố. Cụ thể, (khoảng 95% thời gian trên máy cầu cát của tôi), chức năng 'run_in_thread' kết thúc, tuy nhiên cuộc gọi lại 'print_done' không được gọi cho đến sau khi tôi nhấn Ctrl-C.
Ngoài ra, tôi có thể thay đổi một số điều trong mã ví dụ để làm cho công việc này đáng tin cậy hơn như: giảm số lượng các quá trình sinh sản, gọi self.ready.set từ reactor_ready hoặc thay đổi độ trễ của deferLater.
Tôi đoán có điều kiện chạy đua ở đâu đó giữa lò phản ứng xoắn và chặn các cuộc gọi đa xử lý như Queue.get() hoặc Event.wait()?
Chính xác thì vấn đề tôi đang gặp phải là gì? Có một lỗi trong mã của tôi mà tôi đang thiếu? Tôi có thể sửa lỗi này hoặc bị xoắn không tương thích với các sự kiện/hàng đợi đa xử lý không?
Thứ hai, điều gì đó giống như spawnProcess hoặc Ampoule là giải pháp thay thế được đề xuất? (Như đề xuất trong Mix Python Twisted with multiprocessing?)
Chỉnh sửa (theo yêu cầu):
Tôi đã gặp vấn đề với tất cả các lò phản ứng tôi đã cố gắng glib2reactor selectreactor, pollreactor, và epollreactor. Các epollreactor dường như cho kết quả tốt nhất và dường như làm việc tốt cho ví dụ dưới đây nhưng vẫn mang lại cho tôi cùng một (hoặc tương tự) vấn đề trong ứng dụng của tôi. Tôi sẽ tiếp tục điều tra.
Tôi đang chạy Gentoo Linux kernel 3.3 và 3.4, python 2.7 và tôi đã thử Twisted 10.2.0, 11.0.0, 11.1.0, 12.0.0 và 12.1.0.
Ngoài máy cầu cát của tôi, tôi thấy cùng một vấn đề trên máy tính lõi kép của tôi.
#!/usr/bin/python
# -*- coding: utf-8 *-*
from twisted.internet import reactor
from twisted.internet import threads
from twisted.internet import task
from multiprocessing import Process
from multiprocessing import Event
class TestA(Process):
def __init__(self):
super(TestA, self).__init__()
self.ready = Event()
self.ready.clear()
self.start()
def run(self):
reactor.callWhenRunning(self.reactor_ready)
reactor.run()
def reactor_ready(self, *args):
task.deferLater(reactor, 1, self.node_ready)
return args
def node_ready(self, *args):
print 'node_ready'
self.ready.set()
return args
def reactor_running():
print 'reactor_running'
df = threads.deferToThread(run_in_thread)
df.addCallback(print_done)
def run_in_thread():
print 'run_in_thread'
for n in processes:
n.ready.wait()
def print_done(dfResult=None):
print 'print_done'
reactor.stop()
if __name__ == '__main__':
processes = [TestA() for i in range(8)]
reactor.callWhenRunning(reactor_running)
reactor.run()
Các chi tiết chính xác về phiên bản Twisted bạn đang sử dụng, hệ điều hành nào bạn đang chạy, lò phản ứng bạn đang sử dụng (et cetera) sẽ hữu ích khi trả lời câu hỏi này. – Glyph
Tôi đã gặp vấn đề với tất cả các lò phản ứng mà tôi đã thử glib2reactor selectreactor, pollreactor, và epollreactor. Tôi đang chạy Gentoo Linux, python 2.7 và tôi đã thử Twisted 11.1.0, 12.0.0 và 12.1.0. – Agrajag