পাইথন মেসেজকিউ.উইন.কমকে উইন 32 কম্পের মাধ্যমে চালাচ্ছেন, কীভাবে সময়সীমা ঠিক করবেন?


9

শুরু করার জন্য, আমি বলতে চাই যে এখানে কেউ যদি সহায়তা করতে পারে তবে আপনি অবিশ্বাস্য।

সাধারণ প্রশ্ন

আমার পাইথন প্রোগ্রামটির MSMQ এর সাথে ইন্টারঅ্যাক্ট করা দরকার। মূলত, আমি একটি সারিতে উঁকি দিতে চাই, একটি সারিবদ্ধ উল্লেখ করে যদি কিউতে কিছু না থাকে।

যাইহোক, আমার সর্বোত্তম প্রচেষ্টা সত্ত্বেও, সময়কালের ব্যবধানটি অপেক্ষা করার জন্য আমি পিক () পেতে পারি না, যখন কাতারে আগে কোনও মূল্য নেই। আপনি কি দয়া করে এই কোডটি থেকে অনুপস্থিত চিহ্নিত করতে পারেন?


আমার বর্তমান কোড

এই মুহূর্তে আমার কোড এখানে:

from socket import gethostname

import win32com.client
import pythoncom

import clr
clr.AddReference("System")
clr.AddReference("System.Messaging")
from System import TimeSpan
from System.Messaging import MessageQueue


# Source: [1]
# [1] https://docs.microsoft.com/en-us/previous-versions/windows/desktop/msmq/ms707027%28v%3dvs.85%29
MQ_DENY_NONE = 0x0
MQ_PEEK_ACCESS = 0x1
MQ_SEND_ACCESS = 0x2


# Set up queue
pythoncom.CoInitialize()
qinfo = win32com.client.Dispatch("MSMQ.MSMQQueueInfo")
qinfo.FormatName = f"direct=os:{gethostname()}\\PRIVATE$\\MyQueue"
queue = qinfo.Open(MQ_PEEK_ACCESS, MQ_DENY_NONE)

# Receive a value
timeout_sec = 1.0
timespan = TimeSpan.FromSeconds(timeout_sec)
label, body = "", ""
# TODO: timeout value does not appear working. It never waits when
#  there's no message
if queue.Peek(pythoncom.Empty, pythoncom.Empty, timespan):
    msg = queue.Receive() . # Blocking receive --> remove msg from the queue
    if msg is not None:
        label = msg.Label
        body = msg.Body

আমি দৌড়ে: inspect.getfullargspec(queue.Peek)এবং পেতে:

FullArgSpec(args=['self', 'WantDestinationQueue', 'WantBody', 'ReceiveTimeout', 'WantConnectorType'], varargs=None, varkw=None, defaults=(<PyOleMissing object at 0x00000147F5D43BD0>, <PyOleMissing object at 0x00000147F5D43BD0>, <PyOleMissing object at 0x00000147F5D43BD0>, <PyOleMissing object at 0x00000147F5D43BD0>), kwonlyargs=[], kwonlydefaults=None, annotations={})

যে জিনিসগুলি আমি চেষ্টা করেছি

এই প্রশ্ন : বলা ReceiveTimeout=timespanআমার সমস্যার সমাধান বলে মনে হচ্ছে না।

প্রতিস্থাপন করা হচ্ছে pythoncom.Emptyসঙ্গে pythoncom.Missingকাজ বলে মনে হচ্ছে না

এই উত্তরহীন প্রশ্নটি আমার সাথে খুব মিল বলে মনে হচ্ছে


পাইথনকমের CoWaitForMultipleHandles(Flags, Timeout , Handles )কি এটি আপনাকে সাহায্য করে?
লিনপি

হাই @ লিনপাই আপনার কি বিশদ বিবরণ দিতে আপত্তি আছে? এটি সাহায্য করতে পারে, যদিও এটি এক ধরণের কাজের মতো মনে হয়। আমি ভাবছি কীভাবে সময়সীমার জন্য সঠিক queue.Peek
অর্গগুলি

1
পাইথনের এই ইন্টারফেসটির মধ্যে কেবল একটি চিন্তাভাবনা, তবে অন্যান্য উদাহরণগুলি কেবলমাত্র তাদের সময়সীমার জন্য একটি পূর্ণসংখ্যা (মিলি সেকেন্ডে) ব্যবহার করে। সম্ভবত পাইভিন 32 টাইমস্প্যানগুলি যেভাবে আপনি প্রত্যাশা করছেন তা পরিচালনা করছেন না ...
পিটার ব্রিটেন

@ পিটারব্রিটেন আপনাকে ধন্যবাদ, যে আসলে কৌশলটি করেছে! আমি নীচের উত্তর হিসাবে আপনার মন্তব্য পোস্ট।
ইন্ট্রাস্টেলার এক্সপ্লোরার

উত্তর:


0

আমি এই নিবন্ধটি খুঁজে পেয়েছি এমএসএমকিউ-বার্তা-পাইথন প্রেরণে

নিবন্ধটি আপনাকে দেখায় যে কীভাবে এমএসএমকিউ ব্যবহার করে কোনও বার্তা প্রেরণ এবং গ্রহণ করা যায়। আমি বুঝতে পারি না কেন আপনি কেবল স্ট্যান্ডার্ড সকেট সংযোগ সিনট্যাক্স বলতে পারবেন না যদি আমি কোনও প্যাকেট / সংযোগ না পেয়ে থাকেন তবে সংযোগটি বন্ধ করুন

import select
mysocket.setblocking(0)
ready = select.select([mysocket], [], [], timeout_in_seconds)
if ready[0]:
    data = mysocket.recv(4096)

সুতরাং এর মতো কিছু খুব বেশি কঠিন হওয়া উচিত নয়। সবচেয়ে খারাপ ক্ষেত্রে দৃশ্যে একটি থ্রেড তৈরি করা হয় যা ভেরিয়েবলটি শূন্য বা না হলে প্রতি সময়সীমা_সমীক্ষণ করে। এটি যদি 0 থেকে শূন্যতে সেট থাকে তবে এটি শূন্যের নিকট সারি কিছুই না পেয়ে আরও বার্তাগুলির জন্য অপেক্ষা করুন। পাইথন লগিংয়ের জন্য অ্যাসিঙ্ক্রোনাস এমএসএমকিউ সম্পর্কে একটি গিটহাবও পেয়েছি। অ্যাসিঙ্ক্রোনাস এমএসএমকিউ এটি সবেমাত্র ডেলোপেস 7 এমএসএমকিউর প্রাপ্ত হওয়ার সময় বলেছিলেন said

import time
t_end = time.time() + 60 * 15
messages=0
while time.time() < t_end or messages>0:
    msg = queue.Receive()
    messages+=1
    if(time.time() > t_end and messages>0):
        messages=0
        t_end = time.time() + 60 * 15
    print(f'Got Message from {queue_name}: {msg.Label} - {msg.Body}')

আপনি যে উত্তরটি চেয়েছিলেন তা নয় তবে এটি কার্যকর হবে।


হ্যালো @ মিশেলহার্ন! একাধিক দরকারী workaround প্রদান করার জন্য আপনাকে ধন্যবাদ। যেমন, আমি আপনাকে
বরাদ্দ দিচ্ছি

ধন্যবাদ! @ ইন্ট্রাস্টেলার
মাইকেল হার্ন

0

মূল প্রশ্নের মন্তব্যে, @ পিটারব্রিটেন কেবলমাত্র ব্যবহারের চেষ্টা করার পরামর্শ দিয়েছেন:

তাদের সময়সীমাটির জন্য একটি পূর্ণসংখ্যা (মিলি সেকেন্ডে)

আমি চেষ্টা করে দেখতে পেলাম, এবং বাস্তবে এটি কার্যকর হয়েছিল! আমি floatকাজ করার মান খুঁজে পেয়েছি । এখানে কিছু নমুনা পাইথন কোড রয়েছে:

timeout_sec = 1.0
queue.Peek(pythoncom.Empty, pythoncom.Empty, timeout_sec * 1000):

আপনাকে ধন্যবাদ পিটারব্রিটেন!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.