0

翻訳クラウドソーシング タスク用の Django アプリを構築しようとしています。

データベース内の各タスクにはis_completed、ユーザーがタスクを完了したときに設定されるブール フラグがあります。また、未完了のタスクのリストから選択する「ランダムなタスクを与える」ボタンもあります。

私の質問はこれです。あるユーザーが別のユーザーの直後にボタンをクリックした場合、2 人のユーザーに同じタスクが与えられないようにするにはどうすればよいですか?

タスクがロードされたときに行にフラグを設定し、has_startedランダムに利用可能なタスクのリストから開始されたタスクを削除することを考えていました:しかし、ユーザーがタスクを開始し、終了せずにページを閉じると、設定が解除されません。 ? 未完成のタスクがたくさんあることになります。

おそらく、有効期限が切れるセッション変数を使用して、より賢い方法でこれにフラグを立てることができますか? しかし、JavaScript で「ユーザーがページを閉じる」イベントを確実にキャプチャするのは難しいことはわかっています。

ありがとう!

4

4 に答える 4

0

has_startedフラグを作成する代わりに、それをタイムスタンプにして、タスク完了の妥当な時間を決定することができます(これにより、タスクがX分後にドロップされたと見なすことができます)。

これにより、同じものが複数回翻訳されるリスクがあります(つまり、誰かが本当に遅く、仕事が早く再循環される場合)が、ほとんどの場合をカバーすると思います。

于 2011-02-15T22:51:20.873 に答える
0

私はロックを使用します。データベースに「lock_time」フィールドを追加します。ユーザーがタスクを開始するとすぐに、これを現在の時刻に更新します。次に、everyと呼ばれるイベントを使用して、たとえば、javascriptで10秒、lock_timeを更新します。これで、lock_timeが30秒以上前かどうかを確認できます。そうであれば、ロックを「解除」します。

于 2011-02-15T22:53:18.737 に答える
0

タイムアウトを使用する必要があります。「ユーザーがコンピューターにコーヒーをこぼした」または「ユーザーがハードリセットを行った」などのJavaScriptイベントはありません。

于 2011-02-15T22:54:17.763 に答える
0

開始時にユーザーIDと開始日を設定するのが最善だと思います。

このようにデータベースを更新すると --

UPDATE task t 
SET t.userid = :USERID, t.lastprogress = sysdate() 
WHERE t.userid is null and t.taskid = :TASKID

-- タスクがすでにユーザーに割り当てられている場合、変更されたレコードが 0 であることがわかります。これにより、最初の問題が解決されます。

次に、最終変更日を保存すると、cron ジョブを実行して、一定期間変更されていない放棄されたタスクをクリーンアップできます。しかし、これはまったく別の問題です。タスクを放棄するかどうかを決定するのが早すぎるか遅すぎるかの適切なバランスを見つけるのは困難です。

変更のたびにこの日付も更新される場合、ユーザーは、定期的に保存する限り、他の誰かに盗まれることなく、より長い時間タスクに取り組むことができます. また、変更データを保存するときに (それを行うルーチンを作成できます)、ユーザー ID がまだ一致しているかどうかを確認できます。タスクのユーザー ID が NULL (cron が「放棄された」と判断した) または別のユーザー ID (放棄されたタスクが他の誰かによって拾われた) である場合、エラーを発生させて、タスクがもはやそのユーザーに属していないことをユーザーに伝えることができます。

于 2011-02-15T22:55:35.010 に答える